From: Henrik Gramner Date: Mon, 11 Apr 2016 14:59:46 +0000 (+0200) Subject: msvc: Add snprintf/vsnprintf replacements X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=215afdbd8ecc924f2028f79851458076683e97ad;p=x264 msvc: Add snprintf/vsnprintf replacements MSVC pre-VS2015 has broken snprintf/vsnprintf implementations which are incompatible with C99 and may lead to buffer overflows. --- diff --git a/common/osdep.c b/common/osdep.c index 074a1f31..81301f5a 100644 --- a/common/osdep.c +++ b/common/osdep.c @@ -168,4 +168,39 @@ int x264_is_pipe( const char *path ) return 0; } #endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +/* MSVC pre-VS2015 has broken snprintf/vsnprintf implementations which are incompatible with C99. */ +int x264_snprintf( char *s, size_t n, const char *fmt, ... ) +{ + va_list arg; + va_start( arg, fmt ); + int length = x264_vsnprintf( s, n, fmt, arg ); + va_end( arg ); + return length; +} + +int x264_vsnprintf( char *s, size_t n, const char *fmt, va_list arg ) +{ + int length = -1; + + if( n ) + { + va_list arg2; + va_copy( arg2, arg ); + length = _vsnprintf( s, n, fmt, arg2 ); + va_end( arg2 ); + + /* _(v)snprintf adds a null-terminator only if the length is less than the buffer size. */ + if( length < 0 || length >= n ) + s[n-1] = '\0'; + } + + /* _(v)snprintf returns a negative number if the length is greater than the buffer size. */ + if( length < 0 ) + return _vscprintf( fmt, arg ); + + return length; +} +#endif #endif diff --git a/common/osdep.h b/common/osdep.h index 995d03c4..520710a9 100644 --- a/common/osdep.h +++ b/common/osdep.h @@ -55,7 +55,10 @@ #define strtok_r strtok_s #define S_ISREG(x) (((x) & S_IFMT) == S_IFREG) #if _MSC_VER < 1900 -#define snprintf _snprintf +int x264_snprintf( char *s, size_t n, const char *fmt, ... ); +int x264_vsnprintf( char *s, size_t n, const char *fmt, va_list arg ); +#define snprintf x264_snprintf +#define vsnprintf x264_vsnprintf #endif #endif