[PROPOSED] tzfree now preserves errno
* Makefile, NEWS, newtzset.3: Mention this. * localtime.c (FREE_PRESERVES_ERRNO): Default to 1 if 'free' is known to preserve errno, 0 otherwise. (tzfree): Preserve errno if 'free' does not. --- Makefile | 2 ++ NEWS | 2 ++ localtime.c | 15 +++++++++++++++ newtzset.3 | 4 ++++ 4 files changed, 23 insertions(+) diff --git a/Makefile b/Makefile index 0fe8a9f8..0d33fa17 100644 --- a/Makefile +++ b/Makefile @@ -239,6 +239,8 @@ LDLIBS= # -DEPOCH_OFFSET=N if the 'time' function returns a value N greater # than what POSIX specifies, assuming local time is UT. # For example, N is 252460800 on AmigaOS. +# -DFREE_PRESERVES_ERRNO=[01] if the 'free' function munges or preserves errno +# (default is guessed) # -DHAVE_DECL_ASCTIME_R=0 if <time.h> does not declare asctime_r # on POSIX platforms predating POSIX.1-2024 # -DHAVE_DECL_ENVIRON if <unistd.h> declares 'environ' diff --git a/NEWS b/NEWS index 1ed9b2eb..a9b2d321 100644 --- a/NEWS +++ b/NEWS @@ -93,6 +93,8 @@ Unreleased, experimental changes option is incompatible with POSIX.1-2024 and earlier. It also costs CPU time and memory. + tzfree now preserves errno, consistently with POSIX.1-2024 'free'. + tzcode now uses mempcpy if available, guessing its availability. Compile with -DHAVE_MEMPCPY=1 or 0 to override the guess. diff --git a/localtime.c b/localtime.c index b85941f2..46acf3bd 100644 --- a/localtime.c +++ b/localtime.c @@ -2061,10 +2061,25 @@ tzalloc(char const *name) return sp; } +#ifndef FREE_PRESERVES_ERRNO +# if ((defined _POSIX_VERSION && 202405 <= _POSIX_VERSION) \ + || (defined __GLIBC__ && 2 < __GLIBC__ + (33 <= __GLIBC_MINOR__)) \ + || defined __OpenBSD__ || defined __sun) +# define FREE_PRESERVES_ERRNO 1 +# else +# define FREE_PRESERVES_ERRNO 0 +# endif +#endif + void tzfree(timezone_t sp) { + int err; + if (!FREE_PRESERVES_ERRNO) + err = errno; free(sp); + if (!FREE_PRESERVES_ERRNO) + errno = err; } /* diff --git a/newtzset.3 b/newtzset.3 index 3801ab1b..028cfd25 100644 --- a/newtzset.3 +++ b/newtzset.3 @@ -379,6 +379,10 @@ If successful, the function returns a nonnull pointer to the newly allocated object. Otherwise, it returns a null pointer and sets .IR errno . +The +.B tzfree +function does not modify +.IR errno . .SH ERRORS .TP .B EOVERFLOW -- 2.51.0
participants (1)
-
Paul Eggert