diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2020-12-14 11:38:18 -0800 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2020-12-17 01:39:45 -0800 |
commit | 665f174a1eab75d55ef759b6424ce5b678f496df (patch) | |
tree | 00ab4e7457fe8ae8d5cfc21595acf0df9d636f99 /lib/free.c | |
parent | 03d1588fca2bffe92b08bb4f4ba69273f4843431 (diff) | |
download | gnulib-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.c | 12 |
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; } |