]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Make our usage of memset_s() conform strictly to the C11 standard.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 18 May 2025 16:45:55 +0000 (12:45 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 18 May 2025 16:45:55 +0000 (12:45 -0400)
Per the letter of the C11 standard, one must #define
__STDC_WANT_LIB_EXT1__ as 1 before including <string.h> in order to
have access to memset_s().  It appears that many platforms are lenient
about this, because we weren't doing it and yet the code appeared to
work anyway.  But we now find that with -std=c11, macOS is strict and
doesn't declare memset_s, leading to compile failures since we try to
use it anyway.  (Given the lack of prior reports, perhaps this is new
behavior in the latest SDK?  No matter, we're clearly in the wrong.)

In addition to the immediate problem, which could be fixed merely by
adding the needed #define to explicit_bzero.c, it seems possible that
our configure-time probe for memset_s() could fail in case a platform
implements the function in some odd way due to this spec requirement.
This concern can be fixed in largely the same way that we dealt with
strchrnul() in 6da2ba1d8: switch to using a declaration-based
configure probe instead of a does-it-link probe.

Back-patch to v13 where we started using memset_s().

Reported-by: Lakshmi Narayana Velayudam <dev.narayana.v@gmail.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAA4pTnLcKGG78xeOjiBr5yS7ZeE-Rh=FaFQQGOO=nPzA1L8yEA@mail.gmail.com
Backpatch-through: 13

configure
configure.ac
src/include/pg_config.h.in
src/port/explicit_bzero.c
src/tools/msvc/Solution.pm

index d9095b568a0c2e688006ac1f71246baf2d3f11a0..4ba0a97dd6b936c8c3593e40b2f91b3fbb9c1c6d 100755 (executable)
--- a/configure
+++ b/configure
@@ -16310,7 +16310,7 @@ fi
 LIBS_including_readline="$LIBS"
 LIBS=`echo "$LIBS" | sed -e 's/-ledit//g' -e 's/-lreadline//g'`
 
-for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit inet_pton kqueue mbstowcs_l memset_s poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink readv setproctitle setproctitle_fast setsid shm_open strsignal symlink syncfs sync_file_range uselocale wcstombs_l writev
+for ac_func in backtrace_symbols clock_gettime copyfile fdatasync getifaddrs getpeerucred getrlimit inet_pton kqueue mbstowcs_l poll posix_fallocate ppoll pstat pthread_is_threaded_np readlink readv setproctitle setproctitle_fast setsid shm_open strsignal symlink syncfs sync_file_range uselocale wcstombs_l writev
 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"
@@ -16944,6 +16944,19 @@ cat >>confdefs.h <<_ACEOF
 #define HAVE_DECL_STRCHRNUL $ac_have_decl
 _ACEOF
 
+ac_fn_c_check_decl "$LINENO" "memset_s" "ac_cv_have_decl_memset_s" "#define __STDC_WANT_LIB_EXT1__ 1
+#include <string.h>
+"
+if test "x$ac_cv_have_decl_memset_s" = xyes; then :
+  ac_have_decl=1
+else
+  ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_MEMSET_S $ac_have_decl
+_ACEOF
+
 
 # This is probably only present on macOS, but may as well check always
 ac_fn_c_check_decl "$LINENO" "F_FULLFSYNC" "ac_cv_have_decl_F_FULLFSYNC" "#include <fcntl.h>
index 257c66859bb0d946c80db4084277b1d14b0da403..3f67eb9c85de4f7a82ee605ce1ed9b983eddb3ba 100644 (file)
@@ -1843,7 +1843,6 @@ AC_CHECK_FUNCS(m4_normalize([
        inet_pton
        kqueue
        mbstowcs_l
-       memset_s
        poll
        posix_fallocate
        ppoll
@@ -1924,6 +1923,8 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen])
 AC_CHECK_DECLS([preadv], [], [AC_LIBOBJ(preadv)], [#include <sys/uio.h>])
 AC_CHECK_DECLS([pwritev], [], [AC_LIBOBJ(pwritev)], [#include <sys/uio.h>])
 AC_CHECK_DECLS([strchrnul], [], [], [#include <string.h>])
+AC_CHECK_DECLS([memset_s], [], [], [#define __STDC_WANT_LIB_EXT1__ 1
+#include <string.h>])
 
 # This is probably only present on macOS, but may as well check always
 AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include <fcntl.h>])
index 6d5e1820c9d8be02aa6c6d379852b56e758ec560..676e7bea16d4114d1ffce418a6c03d67bc6916cd 100644 (file)
    to 0 if you don't. */
 #undef HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN
 
+/* Define to 1 if you have the declaration of `memset_s', and to 0 if you
+   don't. */
+#undef HAVE_DECL_MEMSET_S
+
 /* Define to 1 if you have the declaration of `posix_fadvise', and to 0 if you
    don't. */
 #undef HAVE_DECL_POSIX_FADVISE
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H
 
-/* Define to 1 if you have the `memset_s' function. */
-#undef HAVE_MEMSET_S
-
 /* Define to 1 if the system has the type `MINIDUMP_TYPE'. */
 #undef HAVE_MINIDUMP_TYPE
 
index 0d504eb63956aad66b59af6dbcec74c208844e4e..6e742275f8f2cbd74c3816cc07e67f208d05a9e5 100644 (file)
  *-------------------------------------------------------------------------
  */
 
+#define __STDC_WANT_LIB_EXT1__ 1       /* needed to access memset_s() */
+
 #include "c.h"
 
-#if defined(HAVE_MEMSET_S)
+#if HAVE_DECL_MEMSET_S
 
 void
 explicit_bzero(void *buf, size_t len)
index 6db8a10265f28b892e1cdc7c4aea0041be867b9c..4ce258ef6c3c53b4c0d3548304efba53ec809958 100644 (file)
@@ -240,6 +240,7 @@ sub GenerateFiles
                HAVE_DECL_LLVMGETHOSTCPUNAME                => 0,
                HAVE_DECL_LLVMGETHOSTCPUFEATURES            => 0,
                HAVE_DECL_LLVMORCGETSYMBOLADDRESSIN         => 0,
+               HAVE_DECL_MEMSET_S                          => 0,
                HAVE_DECL_POSIX_FADVISE                     => 0,
                HAVE_DECL_PREADV                            => 0,
                HAVE_DECL_PWRITEV                           => 0,
@@ -321,7 +322,6 @@ sub GenerateFiles
                HAVE_MBARRIER_H             => undef,
                HAVE_MBSTOWCS_L             => 1,
                HAVE_MEMORY_H               => 1,
-               HAVE_MEMSET_S               => undef,
                HAVE_MINIDUMP_TYPE          => 1,
                HAVE_MKDTEMP                => undef,
                HAVE_NETINET_TCP_H          => undef,