summaryrefslogtreecommitdiff
path: root/lib/free.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2020-12-14 11:38:18 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2020-12-17 01:39:45 -0800
commit665f174a1eab75d55ef759b6424ce5b678f496df (patch)
tree00ab4e7457fe8ae8d5cfc21595acf0df9d636f99 /lib/free.c
parent03d1588fca2bffe92b08bb4f4ba69273f4843431 (diff)
downloadgnulib-665f174a1eab75d55ef759b6424ce5b678f496df.tar.gz
free: preserve errno
* lib/free.c (rpl_free): Preserve errno. Check for null only if CANNOT_FREE_NULL is defined, as an optimization for POSIX 2008 platforms that do not preserve errno. * m4/free.m4 (gl_FUNC_FREE): Check whether free preserves errno. Also, define CANNOT_FREE_NULL if free cannot free NULL. * modules/free (configure.ac): Also replace 'free' if it does not preserve errno.
Diffstat (limited to 'lib/free.c')
-rw-r--r--lib/free.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/free.c b/lib/free.c
index 50a300ffa6..843ce4816b 100644
--- a/lib/free.c
+++ b/lib/free.c
@@ -22,9 +22,17 @@
#include <stdlib.h>
+#include <errno.h>
+
void
rpl_free (void *p)
{
- if (p)
- free (p);
+#ifdef CANNOT_FREE_NULL
+ if (!p)
+ return;
+#endif
+
+ int err = errno;
+ free (p);
+ errno = err;
}