From 386ca3908de28dd882a62b8f97a329db07b23138 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut Date: Mon, 2 Mar 2026 07:47:42 +0100 Subject: [PATCH] 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 Discussion: https://www.postgresql.org/message-id/flat/c4701776-8d99-41da-938d-88528a3adc15%40eisentraut.org --- configure | 2 +- configure.ac | 2 ++ meson.build | 2 ++ src/include/pg_config.h.in | 6 ++++++ src/port/explicit_bzero.c | 18 +++++++++++++++++- 5 files changed, 28 insertions(+), 2 deletions(-) diff --git a/configure b/configure index a285a6ec3d7..ec4798fe519 100755 --- a/configure +++ b/configure @@ -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" diff --git a/configure.ac b/configure.ac index 476a76c7991..b2f6fdbe6ac 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/meson.build b/meson.build index 5122706477d..3ee8c2325f9 100644 --- a/meson.build +++ b/meson.build @@ -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'], diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index a0bd84376e7..538822cbc70 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -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 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 diff --git a/src/port/explicit_bzero.c b/src/port/explicit_bzero.c index 2147fc3b315..6be7660d28f 100644 --- a/src/port/explicit_bzero.c +++ b/src/port/explicit_bzero.c @@ -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)