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:
Eli Zaretskii 2021-05-20 11:44:54 +03:00
parent b2eed2ae56
commit 328efb47d0

View file

@ -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)