diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index eedaf12d69..fb58c94d4b 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -20,15 +20,8 @@ fi])# PGAC_C_SIGNED # PGAC_C_PRINTF_ARCHETYPE # ----------------------- # Select the format archetype to be used by gcc to check printf-type functions. -# We prefer "gnu_printf", which matches the features glibc supports, notably -# %m, 'z' and 'll' width modifiers ('ll' only matters if int64 requires it), -# and argument order control if we're doing --enable-nls. On platforms where -# the native printf doesn't have 'z'/'ll' or arg control, we replace it with -# src/port/snprintf.c which does, so that the only potential mismatch here is -# whether or not %m is supported. We need that for elog/ereport, so we live -# with the fact that erroneous use of %m in plain printf calls won't be -# detected. (It appears that many versions of gcc/clang wouldn't report it -# even if told to check according to plain printf archetype, anyway.) +# We prefer "gnu_printf", as that most closely matches the features supported +# by src/port/snprintf.c (particularly the %m conversion spec). AC_DEFUN([PGAC_PRINTF_ARCHETYPE], [AC_CACHE_CHECK([for printf format archetype], pgac_cv_printf_archetype, [ac_save_c_werror_flag=$ac_c_werror_flag diff --git a/config/c-library.m4 b/config/c-library.m4 index da7fa77303..d371f1ba6e 100644 --- a/config/c-library.m4 +++ b/config/c-library.m4 @@ -171,106 +171,6 @@ AC_DEFUN([PGAC_STRUCT_ADDRINFO], ])])# PGAC_STRUCT_ADDRINFO -# PGAC_FUNC_SNPRINTF_ARG_CONTROL -# --------------------------------------- -# Determine if snprintf supports %1$ argument selection, e.g. %5$ selects -# the fifth argument after the printf format string. -# This is not in the C99 standard, but in the Single Unix Specification (SUS). -# It is used in our language translation strings. -# -AC_DEFUN([PGAC_FUNC_SNPRINTF_ARG_CONTROL], -[AC_MSG_CHECKING([whether snprintf supports argument control]) -AC_CACHE_VAL(pgac_cv_snprintf_arg_control, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#include - -int main() -{ - char buf[100]; - - /* can it swap arguments? */ - snprintf(buf, 100, "%2\$d %1\$d", 3, 4); - if (strcmp(buf, "4 3") != 0) - return 1; - return 0; -}]])], -[pgac_cv_snprintf_arg_control=yes], -[pgac_cv_snprintf_arg_control=no], -[pgac_cv_snprintf_arg_control=cross]) -])dnl AC_CACHE_VAL -AC_MSG_RESULT([$pgac_cv_snprintf_arg_control]) -])# PGAC_FUNC_SNPRINTF_ARG_CONTROL - -# PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT -# --------------------------------- -# Determine if snprintf supports the z length modifier for printing -# size_t-sized variables. That's supported by C99 and POSIX but not -# all platforms play ball, so we must test whether it's working. -# -AC_DEFUN([PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT], -[AC_MSG_CHECKING([whether snprintf supports the %z modifier]) -AC_CACHE_VAL(pgac_cv_snprintf_size_t_support, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#include - -int main() -{ - char bufz[100]; - char buf64[100]; - - /* - * Print the largest unsigned number fitting in a size_t using both %zu - * and the previously-determined format for 64-bit integers. Note that - * we don't run this code unless we know snprintf handles 64-bit ints. - */ - bufz[0] = '\0'; /* in case snprintf fails to emit anything */ - snprintf(bufz, sizeof(bufz), "%zu", ~((size_t) 0)); - snprintf(buf64, sizeof(buf64), "%" INT64_MODIFIER "u", - (unsigned PG_INT64_TYPE) ~((size_t) 0)); - if (strcmp(bufz, buf64) != 0) - return 1; - return 0; -}]])], -[pgac_cv_snprintf_size_t_support=yes], -[pgac_cv_snprintf_size_t_support=no], -[pgac_cv_snprintf_size_t_support=cross]) -])dnl AC_CACHE_VAL -AC_MSG_RESULT([$pgac_cv_snprintf_size_t_support]) -])# PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT - -# PGAC_FUNC_SNPRINTF_C99_RESULT -# ----------------------------- -# Determine whether snprintf returns the desired buffer length when -# it overruns the actual buffer length. That's required by C99 and POSIX -# but ancient platforms don't behave that way, so we must test. -# While we're at it, let's just verify that it doesn't physically overrun -# the buffer. -# -AC_DEFUN([PGAC_FUNC_SNPRINTF_C99_RESULT], -[AC_MSG_CHECKING([whether snprintf handles buffer overrun per C99]) -AC_CACHE_VAL(pgac_cv_snprintf_c99_result, -[AC_RUN_IFELSE([AC_LANG_SOURCE([[#include -#include - -int main() -{ - char buf[10]; - - strcpy(buf, "abcdefghi"); - if (snprintf(buf, 4, "%d", 123456) != 6) - return 1; - if (strcmp(buf, "123") != 0 || buf[4] != 'e') - return 1; - return 0; -}]])], -[pgac_cv_snprintf_c99_result=yes], -[pgac_cv_snprintf_c99_result=no], -[pgac_cv_snprintf_c99_result=cross]) -])dnl AC_CACHE_VAL -AC_MSG_RESULT([$pgac_cv_snprintf_c99_result]) -])# PGAC_FUNC_SNPRINTF_C99_RESULT - - # PGAC_TYPE_LOCALE_T # ------------------ # Check for the locale_t type and find the right header file. macOS diff --git a/configure b/configure index 508e3ce9c5..c4ce1506b0 100755 --- a/configure +++ b/configure @@ -15367,97 +15367,6 @@ $as_echo "#define HAVE_PS_STRINGS 1" >>confdefs.h fi -# We use our snprintf.c emulation if either snprintf() or vsnprintf() -# is missing. Yes, there are machines that have only one. We may -# also decide to use snprintf.c if snprintf() is present but does not -# have all the features we need --- see below. - -if test "$PORTNAME" = "win32"; then - # Win32 gets snprintf.c built unconditionally. - # - # To properly translate all NLS languages strings, we must support the - # *printf() %$ format, which allows *printf() arguments to be selected - # by position in the translated string. - # - # libintl versions < 0.13 use the native *printf() functions, and Win32 - # *printf() doesn't understand %$, so we must use our /port versions, - # which do understand %$. libintl versions >= 0.13 include their own - # *printf versions on Win32. The libintl 0.13 release note text is: - # - # C format strings with positions, as they arise when a translator - # needs to reorder a sentence, are now supported on all platforms. - # On those few platforms (NetBSD and Woe32) for which the native - # printf()/fprintf()/... functions don't support such format - # strings, replacements are provided through . - # - # We could use libintl >= 0.13's *printf() if we were sure that we had - # a libintl >= 0.13 at runtime, but seeing that there is no clean way - # to guarantee that, it is best to just use our own, so we are sure to - # get %$ support. In include/port.h we disable the *printf() macros - # that might have been defined by libintl. - # - # We do this unconditionally whether NLS is used or not so we are sure - # that all Win32 libraries and binaries behave the same. - pgac_need_repl_snprintf=yes -else - pgac_need_repl_snprintf=no - for ac_func in snprintf -do : - ac_fn_c_check_func "$LINENO" "snprintf" "ac_cv_func_snprintf" -if test "x$ac_cv_func_snprintf" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_SNPRINTF 1 -_ACEOF - -else - pgac_need_repl_snprintf=yes -fi -done - - for ac_func in vsnprintf -do : - ac_fn_c_check_func "$LINENO" "vsnprintf" "ac_cv_func_vsnprintf" -if test "x$ac_cv_func_vsnprintf" = xyes; then : - cat >>confdefs.h <<_ACEOF -#define HAVE_VSNPRINTF 1 -_ACEOF - -else - pgac_need_repl_snprintf=yes -fi -done - -fi - - -# Check whether declares snprintf() and vsnprintf(); if not, -# include/c.h will provide declarations. Note this is a separate test -# from whether the functions exist in the C library --- there are -# systems that have the functions but don't bother to declare them :-( - -ac_fn_c_check_decl "$LINENO" "snprintf" "ac_cv_have_decl_snprintf" "$ac_includes_default" -if test "x$ac_cv_have_decl_snprintf" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_SNPRINTF $ac_have_decl -_ACEOF -ac_fn_c_check_decl "$LINENO" "vsnprintf" "ac_cv_have_decl_vsnprintf" "$ac_includes_default" -if test "x$ac_cv_have_decl_vsnprintf" = xyes; then : - ac_have_decl=1 -else - ac_have_decl=0 -fi - -cat >>confdefs.h <<_ACEOF -#define HAVE_DECL_VSNPRINTF $ac_have_decl -_ACEOF - - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf" >&5 $as_echo_n "checking for isinf... " >&6; } if ${ac_cv_func_isinf+:} false; then : @@ -16175,53 +16084,6 @@ fi # Run tests below here # -------------------- -# For NLS, force use of our snprintf if system's doesn't do arg control. -# See comment above at snprintf test for details. -if test "$enable_nls" = yes -a "$pgac_need_repl_snprintf" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf supports argument control" >&5 -$as_echo_n "checking whether snprintf supports argument control... " >&6; } -if ${pgac_cv_snprintf_arg_control+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - pgac_cv_snprintf_arg_control=cross -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include - -int main() -{ - char buf[100]; - - /* can it swap arguments? */ - snprintf(buf, 100, "%2\$d %1\$d", 3, 4); - if (strcmp(buf, "4 3") != 0) - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - pgac_cv_snprintf_arg_control=yes -else - pgac_cv_snprintf_arg_control=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_snprintf_arg_control" >&5 -$as_echo "$pgac_cv_snprintf_arg_control" >&6; } - - if test $pgac_cv_snprintf_arg_control != yes ; then - pgac_need_repl_snprintf=yes - fi -fi - - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long int is 64 bits" >&5 $as_echo_n "checking whether long int is 64 bits... " >&6; } @@ -16401,8 +16263,6 @@ _ACEOF # Select the printf length modifier that goes with that, too. -# (This used to be bound up with replacement-snprintf selection, but now -# we assume that the native *printf functions use standard length modifiers.) if test x"$pg_int64_type" = x"long long int" ; then INT64_MODIFIER='"ll"' else @@ -16415,120 +16275,6 @@ cat >>confdefs.h <<_ACEOF _ACEOF -# Force use of our snprintf if the system's doesn't support the %z flag. -# (Note this test uses PG_INT64_TYPE and INT64_MODIFIER.) -if test "$pgac_need_repl_snprintf" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf supports the %z modifier" >&5 -$as_echo_n "checking whether snprintf supports the %z modifier... " >&6; } -if ${pgac_cv_snprintf_size_t_support+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - pgac_cv_snprintf_size_t_support=cross -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include - -int main() -{ - char bufz[100]; - char buf64[100]; - - /* - * Print the largest unsigned number fitting in a size_t using both %zu - * and the previously-determined format for 64-bit integers. Note that - * we don't run this code unless we know snprintf handles 64-bit ints. - */ - bufz[0] = '\0'; /* in case snprintf fails to emit anything */ - snprintf(bufz, sizeof(bufz), "%zu", ~((size_t) 0)); - snprintf(buf64, sizeof(buf64), "%" INT64_MODIFIER "u", - (unsigned PG_INT64_TYPE) ~((size_t) 0)); - if (strcmp(bufz, buf64) != 0) - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - pgac_cv_snprintf_size_t_support=yes -else - pgac_cv_snprintf_size_t_support=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_snprintf_size_t_support" >&5 -$as_echo "$pgac_cv_snprintf_size_t_support" >&6; } - - if test "$pgac_cv_snprintf_size_t_support" != yes; then - pgac_need_repl_snprintf=yes - fi -fi - -# Force use of our snprintf if the system's doesn't handle buffer overrun -# as specified by C99. -if test "$pgac_need_repl_snprintf" = no; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether snprintf handles buffer overrun per C99" >&5 -$as_echo_n "checking whether snprintf handles buffer overrun per C99... " >&6; } -if ${pgac_cv_snprintf_c99_result+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - pgac_cv_snprintf_c99_result=cross -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include -#include - -int main() -{ - char buf[10]; - - strcpy(buf, "abcdefghi"); - if (snprintf(buf, 4, "%d", 123456) != 6) - return 1; - if (strcmp(buf, "123") != 0 || buf[4] != 'e') - return 1; - return 0; -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - pgac_cv_snprintf_c99_result=yes -else - pgac_cv_snprintf_c99_result=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_snprintf_c99_result" >&5 -$as_echo "$pgac_cv_snprintf_c99_result" >&6; } - - if test "$pgac_cv_snprintf_c99_result" != yes; then - pgac_need_repl_snprintf=yes - fi -fi - -# Now we have checked all the reasons to replace snprintf -if test $pgac_need_repl_snprintf = yes; then - -$as_echo "#define USE_REPL_SNPRINTF 1" >>confdefs.h - - case " $LIBOBJS " in - *" snprintf.$ac_objext "* ) ;; - *) LIBOBJS="$LIBOBJS snprintf.$ac_objext" - ;; -esac - -fi - # has to be down here, rather than with the other builtins, because # the test uses PG_INT64_TYPE. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_mul_overflow" >&5 diff --git a/configure.in b/configure.in index 70de4a1aa7..158d5a1ac8 100644 --- a/configure.in +++ b/configure.in @@ -1622,53 +1622,6 @@ if test "$pgac_cv_var_PS_STRINGS" = yes ; then fi -# We use our snprintf.c emulation if either snprintf() or vsnprintf() -# is missing. Yes, there are machines that have only one. We may -# also decide to use snprintf.c if snprintf() is present but does not -# have all the features we need --- see below. - -if test "$PORTNAME" = "win32"; then - # Win32 gets snprintf.c built unconditionally. - # - # To properly translate all NLS languages strings, we must support the - # *printf() %$ format, which allows *printf() arguments to be selected - # by position in the translated string. - # - # libintl versions < 0.13 use the native *printf() functions, and Win32 - # *printf() doesn't understand %$, so we must use our /port versions, - # which do understand %$. libintl versions >= 0.13 include their own - # *printf versions on Win32. The libintl 0.13 release note text is: - # - # C format strings with positions, as they arise when a translator - # needs to reorder a sentence, are now supported on all platforms. - # On those few platforms (NetBSD and Woe32) for which the native - # printf()/fprintf()/... functions don't support such format - # strings, replacements are provided through . - # - # We could use libintl >= 0.13's *printf() if we were sure that we had - # a libintl >= 0.13 at runtime, but seeing that there is no clean way - # to guarantee that, it is best to just use our own, so we are sure to - # get %$ support. In include/port.h we disable the *printf() macros - # that might have been defined by libintl. - # - # We do this unconditionally whether NLS is used or not so we are sure - # that all Win32 libraries and binaries behave the same. - pgac_need_repl_snprintf=yes -else - pgac_need_repl_snprintf=no - AC_CHECK_FUNCS(snprintf, [], pgac_need_repl_snprintf=yes) - AC_CHECK_FUNCS(vsnprintf, [], pgac_need_repl_snprintf=yes) -fi - - -# Check whether declares snprintf() and vsnprintf(); if not, -# include/c.h will provide declarations. Note this is a separate test -# from whether the functions exist in the C library --- there are -# systems that have the functions but don't bother to declare them :-( - -AC_CHECK_DECLS([snprintf, vsnprintf]) - - dnl Cannot use AC_CHECK_FUNC because isinf may be a macro AC_CACHE_CHECK([for isinf], ac_cv_func_isinf, [AC_LINK_IFELSE([AC_LANG_PROGRAM([ @@ -1838,16 +1791,6 @@ for the exact reason.]])], # Run tests below here # -------------------- -# For NLS, force use of our snprintf if system's doesn't do arg control. -# See comment above at snprintf test for details. -if test "$enable_nls" = yes -a "$pgac_need_repl_snprintf" = no; then - PGAC_FUNC_SNPRINTF_ARG_CONTROL - if test $pgac_cv_snprintf_arg_control != yes ; then - pgac_need_repl_snprintf=yes - fi -fi - - dnl Check to see if we have a working 64-bit integer type. dnl Since Postgres 8.4, we no longer support compilers without a working dnl 64-bit type; but we have to determine whether that type is called @@ -1870,8 +1813,6 @@ AC_DEFINE_UNQUOTED(PG_INT64_TYPE, $pg_int64_type, [Define to the name of a signed 64-bit integer type.]) # Select the printf length modifier that goes with that, too. -# (This used to be bound up with replacement-snprintf selection, but now -# we assume that the native *printf functions use standard length modifiers.) if test x"$pg_int64_type" = x"long long int" ; then INT64_MODIFIER='"ll"' else @@ -1881,30 +1822,6 @@ fi AC_DEFINE_UNQUOTED(INT64_MODIFIER, $INT64_MODIFIER, [Define to the appropriate printf length modifier for 64-bit ints.]) -# Force use of our snprintf if the system's doesn't support the %z flag. -# (Note this test uses PG_INT64_TYPE and INT64_MODIFIER.) -if test "$pgac_need_repl_snprintf" = no; then - PGAC_FUNC_SNPRINTF_SIZE_T_SUPPORT - if test "$pgac_cv_snprintf_size_t_support" != yes; then - pgac_need_repl_snprintf=yes - fi -fi - -# Force use of our snprintf if the system's doesn't handle buffer overrun -# as specified by C99. -if test "$pgac_need_repl_snprintf" = no; then - PGAC_FUNC_SNPRINTF_C99_RESULT - if test "$pgac_cv_snprintf_c99_result" != yes; then - pgac_need_repl_snprintf=yes - fi -fi - -# Now we have checked all the reasons to replace snprintf -if test $pgac_need_repl_snprintf = yes; then - AC_DEFINE(USE_REPL_SNPRINTF, 1, [Use replacement snprintf() functions.]) - AC_LIBOBJ(snprintf) -fi - # has to be down here, rather than with the other builtins, because # the test uses PG_INT64_TYPE. PGAC_C_BUILTIN_OP_OVERFLOW diff --git a/src/include/c.h b/src/include/c.h index 13c794d8ea..25d7d6036d 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -1147,14 +1147,6 @@ typedef union PGAlignedXLogBlock * standard C library. */ -#if !HAVE_DECL_SNPRINTF -extern int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3, 4); -#endif - -#if !HAVE_DECL_VSNPRINTF -extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args); -#endif - #if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNC extern int fdatasync(int fildes); #endif diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index e576831a71..7cabcd1e75 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -166,10 +166,6 @@ don't. */ #undef HAVE_DECL_RTLD_NOW -/* Define to 1 if you have the declaration of `snprintf', and to 0 if you - don't. */ -#undef HAVE_DECL_SNPRINTF - /* Define to 1 if you have the declaration of `strlcat', and to 0 if you don't. */ #undef HAVE_DECL_STRLCAT @@ -194,10 +190,6 @@ don't. */ #undef HAVE_DECL_SYS_SIGLIST -/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you - don't. */ -#undef HAVE_DECL_VSNPRINTF - /* Define to 1 if you have the `dlopen' function. */ #undef HAVE_DLOPEN @@ -510,9 +502,6 @@ /* Define to 1 if you have the `shm_open' function. */ #undef HAVE_SHM_OPEN -/* Define to 1 if you have the `snprintf' function. */ -#undef HAVE_SNPRINTF - /* Define to 1 if you have spinlocks. */ #undef HAVE_SPINLOCKS @@ -715,9 +704,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_UUID_UUID_H -/* Define to 1 if you have the `vsnprintf' function. */ -#undef HAVE_VSNPRINTF - /* Define to 1 if you have the header file. */ #undef HAVE_WCHAR_H @@ -926,9 +912,6 @@ /* Define to 1 to build with PAM support. (--with-pam) */ #undef USE_PAM -/* Use replacement snprintf() functions. */ -#undef USE_REPL_SNPRINTF - /* Define to 1 to use software CRC-32C implementation (slicing-by-8). */ #undef USE_SLICING_BY_8_CRC32C diff --git a/src/include/pg_config.h.win32 b/src/include/pg_config.h.win32 index 536f06c38c..45d47e996a 100644 --- a/src/include/pg_config.h.win32 +++ b/src/include/pg_config.h.win32 @@ -135,10 +135,6 @@ don't. */ #define HAVE_DECL_RTLD_NOW 0 -/* Define to 1 if you have the declaration of `snprintf', and to 0 if you - don't. */ -#define HAVE_DECL_SNPRINTF 1 - /* Define to 1 if you have the declaration of `strnlen', and to 0 if you don't. */ #define HAVE_DECL_STRNLEN 1 @@ -151,10 +147,6 @@ don't. */ #define HAVE_DECL_STRTOULL 1 -/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you - don't. */ -#define HAVE_DECL_VSNPRINTF 1 - /* Define to 1 if you have the `dlopen' function. */ /* #undef HAVE_DLOPEN */ @@ -376,9 +368,6 @@ /* Define to 1 if you have the `setsid' function. */ /* #undef HAVE_SETSID */ -/* Define to 1 if you have the `snprintf' function. */ -/* #undef HAVE_SNPRINTF */ - /* Define to 1 if you have spinlocks. */ #define HAVE_SPINLOCKS 1 @@ -556,9 +545,6 @@ /* Define to 1 if you have the header file. */ #define HAVE_UTIME_H 1 -/* Define to 1 if you have the `vsnprintf' function. */ -#define HAVE_VSNPRINTF 1 - /* Define to 1 if you have the header file. */ #define HAVE_WCHAR_H 1 @@ -715,9 +701,6 @@ /* Define to 1 to build with PAM support. (--with-pam) */ /* #undef USE_PAM */ -/* Use replacement snprintf() functions. */ -#define USE_REPL_SNPRINTF 1 - /* Define to 1 to use software CRC-32C implementation (slicing-by-8). */ #if (_MSC_VER < 1500) #define USE_SLICING_BY_8_CRC32C 1 diff --git a/src/include/port.h b/src/include/port.h index abbe1ad9a1..597d05e553 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -134,7 +134,12 @@ extern unsigned char pg_tolower(unsigned char ch); extern unsigned char pg_ascii_toupper(unsigned char ch); extern unsigned char pg_ascii_tolower(unsigned char ch); -#ifdef USE_REPL_SNPRINTF +/* + * Beginning in v12, we always replace snprintf() and friends with our own + * implementation. This symbol is no longer consulted by the core code, + * but keep it defined anyway in case any extensions are looking at it. + */ +#define USE_REPL_SNPRINTF 1 /* * Versions of libintl >= 0.13 try to replace printf() and friends with @@ -187,7 +192,6 @@ extern int pg_printf(const char *fmt,...) pg_attribute_printf(1, 2); #define fprintf pg_fprintf #define printf pg_printf #endif -#endif /* USE_REPL_SNPRINTF */ /* Replace strerror() with our own, somewhat more robust wrapper */ extern char *pg_strerror(int errnum); diff --git a/src/interfaces/ecpg/compatlib/Makefile b/src/interfaces/ecpg/compatlib/Makefile index b7bd162902..e07a7fa813 100644 --- a/src/interfaces/ecpg/compatlib/Makefile +++ b/src/interfaces/ecpg/compatlib/Makefile @@ -31,7 +31,8 @@ SHLIB_EXPORTS = exports.txt # Need to recompile any libpgport object files LIBS := $(filter-out -lpgport, $(LIBS)) -OBJS= informix.o strerror.o $(filter snprintf.o strnlen.o, $(LIBOBJS)) $(WIN32RES) +OBJS= informix.o snprintf.o strerror.o \ + $(filter strnlen.o, $(LIBOBJS)) $(WIN32RES) PKG_CONFIG_REQUIRES_PRIVATE = libecpg libpgtypes diff --git a/src/interfaces/ecpg/ecpglib/Makefile b/src/interfaces/ecpg/ecpglib/Makefile index 005d25a2bc..b381623f18 100644 --- a/src/interfaces/ecpg/ecpglib/Makefile +++ b/src/interfaces/ecpg/ecpglib/Makefile @@ -26,8 +26,8 @@ override CFLAGS += $(PTHREAD_CFLAGS) LIBS := $(filter-out -lpgport, $(LIBS)) OBJS= execute.o typename.o descriptor.o sqlda.o data.o error.o prepare.o memory.o \ - connect.o misc.o path.o pgstrcasecmp.o strerror.o \ - $(filter snprintf.o strlcpy.o strnlen.o win32setlocale.o isinf.o, $(LIBOBJS)) \ + connect.o misc.o path.o pgstrcasecmp.o snprintf.o strerror.o \ + $(filter strlcpy.o strnlen.o win32setlocale.o isinf.o, $(LIBOBJS)) \ $(WIN32RES) # thread.c is needed only for non-WIN32 implementation of path.c diff --git a/src/interfaces/ecpg/pgtypeslib/Makefile b/src/interfaces/ecpg/pgtypeslib/Makefile index 18b2402d0f..15d7f33664 100644 --- a/src/interfaces/ecpg/pgtypeslib/Makefile +++ b/src/interfaces/ecpg/pgtypeslib/Makefile @@ -30,8 +30,8 @@ SHLIB_LINK += $(filter -lm, $(LIBS)) SHLIB_EXPORTS = exports.txt OBJS= numeric.o datetime.o common.o dt_common.o timestamp.o interval.o \ - pgstrcasecmp.o strerror.o \ - $(filter rint.o snprintf.o strnlen.o, $(LIBOBJS)) \ + pgstrcasecmp.o snprintf.o strerror.o \ + $(filter rint.o strnlen.o, $(LIBOBJS)) \ string.o \ $(WIN32RES) diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index 8324f4f057..a106088a9f 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -36,9 +36,9 @@ OBJS= fe-auth.o fe-auth-scram.o fe-connect.o fe-exec.o fe-misc.o fe-print.o fe-l libpq-events.o # libpgport C files we always use OBJS += chklocale.o inet_net_ntop.o noblock.o pgstrcasecmp.o pqsignal.o \ - strerror.o thread.o + snprintf.o strerror.o thread.o # libpgport C files that are needed if identified by configure -OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o snprintf.o strlcpy.o strnlen.o win32error.o win32setlocale.o, $(LIBOBJS)) +OBJS += $(filter crypt.o getaddrinfo.o getpeereid.o inet_aton.o open.o system.o strlcpy.o strnlen.o win32error.o win32setlocale.o, $(LIBOBJS)) ifeq ($(enable_strong_random), yes) OBJS += pg_strong_random.o diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.h index e6241f03ea..f8888a451e 100644 --- a/src/pl/plperl/plperl.h +++ b/src/pl/plperl/plperl.h @@ -29,11 +29,8 @@ * Sometimes perl carefully scribbles on our *printf macros. * So we undefine them here and redefine them after it's done its dirty deed. */ - -#ifdef USE_REPL_SNPRINTF #undef snprintf #undef vsnprintf -#endif /* * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's @@ -99,7 +96,6 @@ #endif /* put back our snprintf and vsnprintf */ -#ifdef USE_REPL_SNPRINTF #ifdef snprintf #undef snprintf #endif @@ -113,7 +109,6 @@ #define vsnprintf pg_vsnprintf #define snprintf pg_snprintf #endif /* __GNUC__ */ -#endif /* USE_REPL_SNPRINTF */ /* perl version and platform portability */ #define NEED_eval_pv diff --git a/src/pl/plpython/plpython.h b/src/pl/plpython/plpython.h index 6cc323a568..aefbfc2f82 100644 --- a/src/pl/plpython/plpython.h +++ b/src/pl/plpython/plpython.h @@ -33,11 +33,8 @@ * Sometimes python carefully scribbles on our *printf macros. * So we undefine them here and redefine them after it's done its dirty deed. */ - -#ifdef USE_REPL_SNPRINTF #undef snprintf #undef vsnprintf -#endif #if defined(_MSC_VER) && defined(_DEBUG) /* Python uses #pragma to bring in a non-default libpython on VC++ if @@ -124,7 +121,6 @@ typedef int Py_ssize_t; #include /* put back our snprintf and vsnprintf */ -#ifdef USE_REPL_SNPRINTF #ifdef snprintf #undef snprintf #endif @@ -138,7 +134,6 @@ typedef int Py_ssize_t; #define vsnprintf pg_vsnprintf #define snprintf pg_snprintf #endif /* __GNUC__ */ -#endif /* USE_REPL_SNPRINTF */ /* * Used throughout, and also by the Python 2/3 porting layer, so it's easier to diff --git a/src/port/Makefile b/src/port/Makefile index b3a10ba014..a2ee8e2d6d 100644 --- a/src/port/Makefile +++ b/src/port/Makefile @@ -33,7 +33,8 @@ LIBS += $(PTHREAD_LIBS) OBJS = $(LIBOBJS) $(PG_CRC32C_OBJS) chklocale.o erand48.o inet_net_ntop.o \ noblock.o path.o pgcheckdir.o pgmkdirp.o pgsleep.o \ pgstrcasecmp.o pqsignal.o \ - qsort.o qsort_arg.o quotes.o sprompt.o strerror.o tar.o thread.o + qsort.o qsort_arg.o quotes.o snprintf.o sprompt.o strerror.o \ + tar.o thread.o ifeq ($(enable_strong_random), yes) OBJS += pg_strong_random.o diff --git a/src/port/README b/src/port/README index 4ae96da015..c446b46e26 100644 --- a/src/port/README +++ b/src/port/README @@ -18,7 +18,7 @@ and adding infrastructure to recompile the object files: OBJS= execute.o typename.o descriptor.o data.o error.o prepare.o memory.o \ connect.o misc.o path.o exec.o \ - $(filter snprintf.o, $(LIBOBJS)) + $(filter strlcat.o, $(LIBOBJS)) The problem is that there is no testing of which object files need to be added, but missing functions usually show up when linking user