Check for memset_explicit() and explicit_memset()

We can use either of these to implement a missing explicit_bzero().

explicit_memset() is supported on NetBSD.  NetBSD hitherto didn't have
a way to implement explicit_bzero() other than the fallback variant.

memset_explicit() is the C23 standard, so we use it as first
preference.  It is currently supported on:

- NetBSD 11
- FreeBSD 15
- glibc 2.43

It doesn't provide additional coverage, but as it's the new standard,
its availability will presumably grow.

Reviewed-by: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Discussion: https://www.postgresql.org/message-id/flat/c4701776-8d99-41da-938d-88528a3adc15%40eisentraut.org
This commit is contained in:
Peter Eisentraut 2026-03-02 07:47:42 +01:00
parent f68d7e7483
commit 386ca3908d
5 changed files with 28 additions and 2 deletions

2
configure vendored
View file

@ -15742,7 +15742,7 @@ fi
LIBS_including_readline="$LIBS"
LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
for ac_func in backtrace_symbols copyfile copy_file_range elf_aux_info getauxval getifaddrs getpeerucred inet_pton kqueue localeconv_l mbstowcs_l posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strsignal syncfs sync_file_range uselocale wcstombs_l
for ac_func in backtrace_symbols copyfile copy_file_range elf_aux_info explicit_memset getauxval getifaddrs getpeerucred inet_pton kqueue localeconv_l mbstowcs_l memset_explicit posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast strsignal syncfs sync_file_range uselocale wcstombs_l
do :
as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"

View file

@ -1841,6 +1841,7 @@ AC_CHECK_FUNCS(m4_normalize([
copyfile
copy_file_range
elf_aux_info
explicit_memset
getauxval
getifaddrs
getpeerucred
@ -1848,6 +1849,7 @@ AC_CHECK_FUNCS(m4_normalize([
kqueue
localeconv_l
mbstowcs_l
memset_explicit
posix_fallocate
ppoll
pthread_is_threaded_np

View file

@ -3015,6 +3015,7 @@ func_checks = [
['dlsym', {'dependencies': [dl_dep], 'define': false}],
['elf_aux_info'],
['explicit_bzero'],
['explicit_memset'],
['getauxval'],
['getifaddrs'],
['getopt', {'dependencies': [getopt_dep, gnugetopt_dep], 'skip': always_replace_getopt}],
@ -3026,6 +3027,7 @@ func_checks = [
['kqueue'],
['localeconv_l'],
['mbstowcs_l'],
['memset_explicit'],
['mkdtemp'],
['posix_fadvise'],
['posix_fallocate'],

View file

@ -128,6 +128,9 @@
/* Define to 1 if you have the `explicit_bzero' function. */
#undef HAVE_EXPLICIT_BZERO
/* Define to 1 if you have the `explicit_memset' function. */
#undef HAVE_EXPLICIT_MEMSET
/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
#undef HAVE_FSEEKO
@ -277,6 +280,9 @@
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `memset_explicit' function. */
#undef HAVE_MEMSET_EXPLICIT
/* Define to 1 if you have the `mkdtemp' function. */
#undef HAVE_MKDTEMP

View file

@ -16,7 +16,23 @@
#include "c.h"
#if HAVE_DECL_MEMSET_S
#if defined(HAVE_MEMSET_EXPLICIT)
void
explicit_bzero(void *buf, size_t len)
{
(void) memset_explicit(buf, 0, len);
}
#elif defined(HAVE_EXPLICIT_MEMSET)
void
explicit_bzero(void *buf, size_t len)
{
(void) explicit_memset(buf, 0, len);
}
#elif HAVE_DECL_MEMSET_S
void
explicit_bzero(void *buf, size_t len)