فهرست منبع

mprintf: use snprintf if available

This is the single place in libcurl code where it uses the "native"
s(n)printf() function. Used for writing floats. The use has been
reviewed and vetted and uses a HUGE target buffer, but switching to
snprintf() still makes this safer and removes build-time warnings.

Reported-by: Philip Heiduck

Fixes #9569
Closes #9570
Daniel Stenberg 1 سال پیش
والد
کامیت
935b1bd454
4فایلهای تغییر یافته به همراه15 افزوده شده و 0 حذف شده
  1. 5 0
      CMakeLists.txt
  2. 1 0
      configure.ac
  3. 5 0
      lib/config-win32.h
  4. 4 0
      lib/mprintf.c

+ 5 - 0
CMakeLists.txt

@@ -1079,6 +1079,11 @@ check_symbol_exists(getrlimit      "${CURL_INCLUDES}" HAVE_GETRLIMIT)
 check_symbol_exists(setlocale      "${CURL_INCLUDES}" HAVE_SETLOCALE)
 check_symbol_exists(setlocale      "${CURL_INCLUDES}" HAVE_SETLOCALE)
 check_symbol_exists(setmode        "${CURL_INCLUDES}" HAVE_SETMODE)
 check_symbol_exists(setmode        "${CURL_INCLUDES}" HAVE_SETMODE)
 check_symbol_exists(setrlimit      "${CURL_INCLUDES}" HAVE_SETRLIMIT)
 check_symbol_exists(setrlimit      "${CURL_INCLUDES}" HAVE_SETRLIMIT)
+
+if(NOT MSVC OR (MSVC_VERSION GREATER_EQUAL 1900))
+  # earlier MSVC compilers had faulty snprintf implementations
+  check_symbol_exists(snprintf       "${CURL_INCLUDES}" HAVE_SNPRINTF)
+endif()
 check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME)
 check_function_exists(mach_absolute_time HAVE_MACH_ABSOLUTE_TIME)
 check_symbol_exists(inet_pton      "${CURL_INCLUDES}" HAVE_INET_PTON)
 check_symbol_exists(inet_pton      "${CURL_INCLUDES}" HAVE_INET_PTON)
 
 

+ 1 - 0
configure.ac

@@ -3535,6 +3535,7 @@ AC_CHECK_FUNCS([fnmatch \
   setlocale \
   setlocale \
   setmode \
   setmode \
   setrlimit \
   setrlimit \
+  snprintf \
   utime \
   utime \
   utimes
   utimes
 ],[
 ],[

+ 5 - 0
lib/config-win32.h

@@ -254,6 +254,11 @@
 /* Define to the function return type for send. */
 /* Define to the function return type for send. */
 #define SEND_TYPE_RETV int
 #define SEND_TYPE_RETV int
 
 
+/* Define to 1 if you have the snprintf function. */
+#if defined(_MSC_VER) && (_MSC_VER >= 1900)
+#define HAVE_SNPRINTF 1
+#endif
+
 /* ---------------------------------------------------------------- */
 /* ---------------------------------------------------------------- */
 /*                       TYPEDEF REPLACEMENTS                       */
 /*                       TYPEDEF REPLACEMENTS                       */
 /* ---------------------------------------------------------------- */
 /* ---------------------------------------------------------------- */

+ 4 - 0
lib/mprintf.c

@@ -964,7 +964,11 @@ static int dprintf_formatf(
 #endif
 #endif
         /* NOTE NOTE NOTE!! Not all sprintf implementations return number of
         /* NOTE NOTE NOTE!! Not all sprintf implementations return number of
            output characters */
            output characters */
+#ifdef HAVE_SNPRINTF
+        (snprintf)(work, sizeof(work), formatbuf, p->data.dnum);
+#else
         (sprintf)(work, formatbuf, p->data.dnum);
         (sprintf)(work, formatbuf, p->data.dnum);
+#endif
 #ifdef __clang__
 #ifdef __clang__
 #pragma clang diagnostic pop
 #pragma clang diagnostic pop
 #endif
 #endif