Eliminate 'unsafe vsprintf is deprecated' compiler warning
authorIvan Maidanski <ivmai@mail.ru>
Fri, 28 Oct 2016 06:35:33 +0000 (09:35 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Fri, 28 Oct 2016 07:02:12 +0000 (10:02 +0300)
Replacement of vsprintf to vsnprintf (or similar) if available.

Note that no buffer overflow occurs in CORD_vsprintf as buf is
allocated dynamically based on format string.

* cord/cordprnt.c (GC_VSNPRINTF): New macro (the definition is copied
from misc.c).
* cord/cordprnt.c (CORD_vsprintf): Replace vsprintf(buf,...) call with
GC_VSNPRINTF(buf,max_size+1,...).

cord/cordprnt.c

index d3a85da..70bad9c 100644 (file)
@@ -172,6 +172,20 @@ static int extract_conv_spec(CORD_pos source, char *buf,
     return(result);
 }
 
+#if defined(DJGPP) || defined(__STRICT_ANSI__)
+  /* vsnprintf is missing in DJGPP (v2.0.3) */
+# define GC_VSNPRINTF(buf, bufsz, format, args) vsprintf(buf, format, args)
+#elif defined(_MSC_VER)
+# ifdef MSWINCE
+    /* _vsnprintf is deprecated in WinCE */
+#   define GC_VSNPRINTF StringCchVPrintfA
+# else
+#   define GC_VSNPRINTF _vsnprintf
+# endif
+#else
+# define GC_VSNPRINTF vsnprintf
+#endif
+
 int CORD_vsprintf(CORD * out, CORD format, va_list args)
 {
     CORD_ec result;
@@ -328,7 +342,8 @@ int CORD_vsprintf(CORD * out, CORD format, va_list args)
                             res = -1;
                     }
                     if (0 == res)
-                      res = vsprintf(buf, conv_spec, vsprintf_args);
+                      res = GC_VSNPRINTF(buf, max_size + 1, conv_spec,
+                                         vsprintf_args);
 #                   if defined(CPPCHECK) || defined(__va_copy) \
                        || (defined(__GNUC__) && !defined(__DJGPP__) \
                            && !defined(__EMX__))