]> git.eshelyaron.com Git - emacs.git/commitdiff
Make sure gmalloc's hybrid_free preserves errno
authorEli Zaretskii <eliz@gnu.org>
Thu, 20 May 2021 08:44:54 +0000 (11:44 +0300)
committerEli Zaretskii <eliz@gnu.org>
Thu, 20 May 2021 08:44:54 +0000 (11:44 +0300)
* 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>.

src/gmalloc.c

index dedd25fa22fa6e9e68336d8054c088fb997c1650..55ae7365d99e50318b9f5940d64e275c72bf8350 100644 (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)