diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2025-05-18 12:45:55 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2025-05-18 12:45:55 -0400 |
commit | 00652b3c9fb7bf2122bb076d63b15bc65e12ff71 (patch) | |
tree | c6976678148216097ca4f7228f635bdd8b88bb0d /src | |
parent | 113351ee17230bc1727ea117d53e2ae83fa7e98f (diff) |
Make our usage of memset_s() conform strictly to the C11 standard.
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
Diffstat (limited to 'src')
-rw-r--r-- | src/include/pg_config.h.in | 7 | ||||
-rw-r--r-- | src/port/explicit_bzero.c | 4 | ||||
-rw-r--r-- | src/tools/msvc/Solution.pm | 2 |
3 files changed, 8 insertions, 5 deletions
diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index 6d5e1820c9d..676e7bea16d 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -126,6 +126,10 @@ 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 @@ -383,9 +387,6 @@ /* 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 diff --git a/src/port/explicit_bzero.c b/src/port/explicit_bzero.c index 0d504eb6395..6e742275f8f 100644 --- a/src/port/explicit_bzero.c +++ b/src/port/explicit_bzero.c @@ -12,9 +12,11 @@ *------------------------------------------------------------------------- */ +#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) diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 6db8a10265f..4ce258ef6c3 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -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, |