Make sure gmalloc's hybrid_free preserves errno
* src/gmalloc.c (hybrid_free_1): New function, with the body of the previous 'hybrid_free'. (hybrid_free): Call 'hybrid_free_1' while preserving the value of 'errno'. Suggested by Paul Eggert <eggert@cs.ucla.edu>.
This commit is contained in:
parent
b2eed2ae56
commit
328efb47d0
1 changed files with 20 additions and 2 deletions
|
@ -1726,8 +1726,8 @@ hybrid_calloc (size_t nmemb, size_t size)
|
|||
return gcalloc (nmemb, size);
|
||||
}
|
||||
|
||||
void
|
||||
hybrid_free (void *ptr)
|
||||
static void
|
||||
hybrid_free_1 (void *ptr)
|
||||
{
|
||||
if (allocated_via_gmalloc (ptr))
|
||||
gfree (ptr);
|
||||
|
@ -1735,6 +1735,24 @@ hybrid_free (void *ptr)
|
|||
free (ptr);
|
||||
}
|
||||
|
||||
void
|
||||
hybrid_free (void *ptr)
|
||||
{
|
||||
/* Stolen from Gnulib, to make sure we preserve errno. */
|
||||
#if defined __GNUC__ && !defined __clang__
|
||||
int err[2];
|
||||
err[0] = errno;
|
||||
err[1] = errno;
|
||||
errno = 0;
|
||||
hybrid_free_1 (ptr);
|
||||
errno = err[errno == 0];
|
||||
#else
|
||||
int err = errno;
|
||||
hybrid_free_1 (ptr);
|
||||
errno = err;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined HAVE_ALIGNED_ALLOC || defined HAVE_POSIX_MEMALIGN
|
||||
void *
|
||||
hybrid_aligned_alloc (size_t alignment, size_t size)
|
||||
|
|
Loading…
Add table
Reference in a new issue