]> granicus.if.org Git - postgresql/commitdiff
Fix omissions in snprintf.c's coverage of standard *printf functions.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Oct 2018 23:15:55 +0000 (19:15 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 8 Oct 2018 23:15:55 +0000 (19:15 -0400)
A warning on a NetBSD box revealed to me that pg_waldump/compat.c
is using vprintf(), which snprintf.c did not provide coverage for.
This is not good if we want to have uniform *printf behavior, and
it's pretty silly to omit when it's a one-line function.

I also noted that snprintf.c has pg_vsprintf() but for some reason
it was not exposed to the outside world, creating another way in
which code might accidentally invoke the platform *printf family.

Let's just make sure that we replace all eight of the POSIX-standard
printf family.

Also, upgrade plperl.h and plpython.h to make sure that they do
their undefine/redefine rain dance for all eight, not some random
maybe-sufficient subset thereof.

src/include/port.h
src/pl/plperl/plperl.h
src/pl/plpython/plpython.h
src/port/snprintf.c

index 0729c3fc2e5aad054f1c9b740a34c2e3b074c8e0..3a53bcf2e4b5ef1d7dbb49bf16cec1d417320730 100644 (file)
@@ -152,6 +152,9 @@ extern unsigned char pg_ascii_tolower(unsigned char ch);
 #ifdef snprintf
 #undef snprintf
 #endif
+#ifdef vsprintf
+#undef vsprintf
+#endif
 #ifdef sprintf
 #undef sprintf
 #endif
@@ -161,15 +164,20 @@ extern unsigned char pg_ascii_tolower(unsigned char ch);
 #ifdef fprintf
 #undef fprintf
 #endif
+#ifdef vprintf
+#undef vprintf
+#endif
 #ifdef printf
 #undef printf
 #endif
 
 extern int     pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
 extern int     pg_snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3, 4);
+extern int     pg_vsprintf(char *str, const char *fmt, va_list args);
 extern int     pg_sprintf(char *str, const char *fmt,...) pg_attribute_printf(2, 3);
 extern int     pg_vfprintf(FILE *stream, const char *fmt, va_list args);
 extern int     pg_fprintf(FILE *stream, const char *fmt,...) pg_attribute_printf(2, 3);
+extern int     pg_vprintf(const char *fmt, va_list args);
 extern int     pg_printf(const char *fmt,...) pg_attribute_printf(1, 2);
 
 /*
@@ -182,9 +190,11 @@ extern int pg_printf(const char *fmt,...) pg_attribute_printf(1, 2);
  */
 #define vsnprintf              pg_vsnprintf
 #define snprintf               pg_snprintf
+#define vsprintf               pg_vsprintf
 #define sprintf                        pg_sprintf
 #define vfprintf               pg_vfprintf
 #define fprintf                        pg_fprintf
+#define vprintf                        pg_vprintf
 #define printf(...)            pg_printf(__VA_ARGS__)
 
 /* This is also provided by snprintf.c */
index 2b733546c37a1621d50653465cef23bfe2bddec6..12fbad9787376d7e61327fcf862a0ca11f30d447 100644 (file)
  * Sometimes perl carefully scribbles on our *printf macros.
  * So we undefine them here and redefine them after it's done its dirty deed.
  */
-#undef snprintf
 #undef vsnprintf
+#undef snprintf
+#undef vsprintf
+#undef sprintf
+#undef vfprintf
+#undef fprintf
+#undef vprintf
+#undef printf
 
 /*
  * ActivePerl 5.18 and later are MinGW-built, and their headers use GCC's
 #undef socket
 #undef stat
 #undef unlink
-#undef vfprintf
 #endif
 
 #include "XSUB.h"
 #endif
 
-/* put back our snprintf and vsnprintf */
+/* put back our *printf macros ... this must match src/include/port.h */
+#ifdef vsnprintf
+#undef vsnprintf
+#endif
 #ifdef snprintf
 #undef snprintf
 #endif
-#ifdef vsnprintf
-#undef vsnprintf
+#ifdef vsprintf
+#undef vsprintf
+#endif
+#ifdef sprintf
+#undef sprintf
+#endif
+#ifdef vfprintf
+#undef vfprintf
 #endif
+#ifdef fprintf
+#undef fprintf
+#endif
+#ifdef vprintf
+#undef vprintf
+#endif
+#ifdef printf
+#undef printf
+#endif
+
 #define vsnprintf              pg_vsnprintf
 #define snprintf               pg_snprintf
+#define vsprintf               pg_vsprintf
+#define sprintf                        pg_sprintf
+#define vfprintf               pg_vfprintf
+#define fprintf                        pg_fprintf
+#define vprintf                        pg_vprintf
+#define printf(...)            pg_printf(__VA_ARGS__)
 
 /* perl version and platform portability */
 #define NEED_eval_pv
index eaf3e4a154fdddcf9eeefa1fd84d05c306020ddb..8cb922de724c6efe9d80f0bb259ad36689362a77 100644 (file)
  * Sometimes python carefully scribbles on our *printf macros.
  * So we undefine them here and redefine them after it's done its dirty deed.
  */
-#undef snprintf
 #undef vsnprintf
+#undef snprintf
+#undef vsprintf
+#undef sprintf
+#undef vfprintf
+#undef fprintf
+#undef vprintf
+#undef printf
 
 #if defined(_MSC_VER) && defined(_DEBUG)
 /* Python uses #pragma to bring in a non-default libpython on VC++ if
@@ -120,15 +126,40 @@ typedef int Py_ssize_t;
 #include <compile.h>
 #include <eval.h>
 
-/* put back our snprintf and vsnprintf */
+/* put back our *printf macros ... this must match src/include/port.h */
+#ifdef vsnprintf
+#undef vsnprintf
+#endif
 #ifdef snprintf
 #undef snprintf
 #endif
-#ifdef vsnprintf
-#undef vsnprintf
+#ifdef vsprintf
+#undef vsprintf
 #endif
-#define vsnprintf                              pg_vsnprintf
-#define snprintf                               pg_snprintf
+#ifdef sprintf
+#undef sprintf
+#endif
+#ifdef vfprintf
+#undef vfprintf
+#endif
+#ifdef fprintf
+#undef fprintf
+#endif
+#ifdef vprintf
+#undef vprintf
+#endif
+#ifdef printf
+#undef printf
+#endif
+
+#define vsnprintf              pg_vsnprintf
+#define snprintf               pg_snprintf
+#define vsprintf               pg_vsprintf
+#define sprintf                        pg_sprintf
+#define vfprintf               pg_vfprintf
+#define fprintf                        pg_fprintf
+#define vprintf                        pg_vprintf
+#define printf(...)            pg_printf(__VA_ARGS__)
 
 /*
  * Used throughout, and also by the Python 2/3 porting layer, so it's easier to
index 58300eab9546a11deb6644383d31ce27b5d400c5..31438dded455e321ee1677a68b33a7ea29a45f22 100644 (file)
 /* Prevent recursion */
 #undef vsnprintf
 #undef snprintf
+#undef vsprintf
 #undef sprintf
 #undef vfprintf
 #undef fprintf
+#undef vprintf
 #undef printf
 
 /*
@@ -208,7 +210,7 @@ pg_snprintf(char *str, size_t count, const char *fmt,...)
        return len;
 }
 
-static int
+int
 pg_vsprintf(char *str, const char *fmt, va_list args)
 {
        PrintfTarget target;
@@ -270,6 +272,12 @@ pg_fprintf(FILE *stream, const char *fmt,...)
        return len;
 }
 
+int
+pg_vprintf(const char *fmt, va_list args)
+{
+       return pg_vfprintf(stdout, fmt, args);
+}
+
 int
 pg_printf(const char *fmt,...)
 {