From: Eric Haszlakiewicz Date: Fri, 25 Aug 2017 05:15:39 +0000 (-0400) Subject: PR#331: for Visual Studio, use a snprintf/vsnprintf wrapper that ensures the string... X-Git-Tag: json-c-0.13-20171207~62 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=81f6edbfd579214b3e337885b5148c3931780365;p=json-c PR#331: for Visual Studio, use a snprintf/vsnprintf wrapper that ensures the string is terminated. --- diff --git a/json_object.c b/json_object.c index 7148731..a317123 100644 --- a/json_object.c +++ b/json_object.c @@ -31,13 +31,7 @@ #include "json_util.h" #include "math_compat.h" #include "strdup_compat.h" - -#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER) - /* MSC has the version as _snprintf */ -# define snprintf _snprintf -#elif !defined(HAVE_SNPRINTF) -# error You do not have snprintf on your system. -#endif /* HAVE_SNPRINTF */ +#include "snprintf_compat.h" // Don't define this. It's not thread-safe. /* #define REFCOUNT_DEBUG 1 */ diff --git a/json_util.c b/json_util.c index cc57e34..2121150 100644 --- a/json_util.c +++ b/json_util.c @@ -48,12 +48,7 @@ # define open _open #endif -#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER) - /* MSC has the version as _snprintf */ -# define snprintf _snprintf -#elif !defined(HAVE_SNPRINTF) -# error You do not have snprintf on your system. -#endif /* HAVE_SNPRINTF */ +#include "snprintf_compat.h" #include "debug.h" #include "printbuf.h" diff --git a/printbuf.c b/printbuf.c index 2745339..6c77b5d 100644 --- a/printbuf.c +++ b/printbuf.c @@ -27,6 +27,7 @@ #include "debug.h" #include "printbuf.h" +#include "snprintf_compat.h" #include "vasprintf_compat.h" static int printbuf_extend(struct printbuf *p, int min_size); diff --git a/snprintf_compat.h b/snprintf_compat.h new file mode 100644 index 0000000..7323aaa --- /dev/null +++ b/snprintf_compat.h @@ -0,0 +1,36 @@ +#ifndef __snprintf_compat_h +#define __snprintf_compat_h + +/* + * Microsoft's _vsnprintf and _snprint don't always terminate + * the string, so use wrappers that ensure that. + */ + +#include + +#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER) +static int json_c_vsnprintf(char *str, size_t size, const char *format, va_list ap) +{ + int ret; + ret = _vsnprintf(str, size, format, ap); + str[size - 1] = '\0'; + return ret; +} +#define vsnprintf json_c_vsnprintf + +static int json_c_snprintf(char *str, size_t size, const char *format, ...) +{ + va_list ap; + int ret; + va_start(ap, format); + ret = json_c_vsnprintf(str, size, format, ap); + va_end(ap); + return ret; +} +#define snprintf json_c_snprintf + +#elif !defined(HAVE_SNPRINTF) /* !HAVE_SNPRINTF */ +# error Need vsnprintf! +#endif /* !HAVE_SNPRINTF && defined(WIN32) */ + +#endif /* __snprintf_compat_h */ diff --git a/tests/test_locale.c b/tests/test_locale.c index a3e319d..7d6541a 100644 --- a/tests/test_locale.c +++ b/tests/test_locale.c @@ -7,6 +7,7 @@ #include "config.h" #include "json.h" #include "json_tokener.h" +#include "snprintf_compat.h" #ifdef HAVE_LOCALE_H #include diff --git a/vasprintf_compat.h b/vasprintf_compat.h index 51e234b..40ff550 100644 --- a/vasprintf_compat.h +++ b/vasprintf_compat.h @@ -1,11 +1,7 @@ #ifndef __vasprintf_compat_h #define __vasprintf_compat_h -#if !defined(HAVE_VSNPRINTF) && defined(_MSC_VER) -# define vsnprintf _vsnprintf -#elif !defined(HAVE_VSNPRINTF) /* !HAVE_VSNPRINTF */ -# error Need vsnprintf! -#endif /* !HAVE_VSNPRINTF && defined(WIN32) */ +#include "snprintf_compat.h" #if !defined(HAVE_VASPRINTF) /* CAW: compliant version of vasprintf */