From: David Flynn Date: Wed, 1 Apr 2009 21:40:02 +0000 (+0000) Subject: win32: fix %zu fixups - dont use mingw's vsnprintf X-Git-Tag: 1.0.0-pre2~256 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=151982aab503fa812cd4d6e830df34e78871c106;p=vlc win32: fix %zu fixups - dont use mingw's vsnprintf Traditionally, MSVCRT has provided vsnprintf as _vsnprintf; to 'aid' portability/standards compliance, mingw provide a static version of [v]snprintf that is buggy. The bug manifests as %lx is treated as a 64bit argument not 32bit, ie consumes two 32bit parameters. if a %s were to follow a %lx, bad things can happen. Solution: Be sure to use the MSVCRT version, at least it behaves as expected Additionally, make it a bit more obvious when vlc wrappers are being called by other wrappers. Signed-off-by: David Flynn Signed-off-by: Jean-Baptiste Kempf --- diff --git a/include/vlc_fixups.h b/include/vlc_fixups.h index 15172b2267..02cf88c804 100644 --- a/include/vlc_fixups.h +++ b/include/vlc_fixups.h @@ -124,7 +124,11 @@ static inline int vlc_vsprintf (char *str, const char *format, va_list ap) static inline int vlc_vsnprintf (char *str, size_t size, const char *format, va_list ap) { char *fmt = vlc_fix_format_string (format); - int ret = vsnprintf (str, size, fmt ? fmt : format, ap); + /* traditionally, MSVCRT has provided vsnprintf as _vsnprintf; + * to 'aid' portability/standards compliance, mingw provides a + * static version of vsnprintf that is buggy. Be sure to use + * MSVCRT version, at least it behaves as expected */ + int ret = _vsnprintf (str, size, fmt ? fmt : format, ap); free (fmt); return ret; } @@ -135,7 +139,7 @@ static inline int vlc_printf (const char *format, ...) va_list ap; int ret; va_start (ap, format); - ret = vprintf (format, ap); + ret = vlc_vprintf (format, ap); va_end (ap); return ret; } @@ -146,7 +150,7 @@ static inline int vlc_fprintf (FILE *stream, const char *format, ...) va_list ap; int ret; va_start (ap, format); - ret = vfprintf (stream, format, ap); + ret = vlc_vfprintf (stream, format, ap); va_end (ap); return ret; } @@ -158,7 +162,7 @@ static inline int vlc_sprintf (char *str, const char *format, ...) va_list ap; int ret; va_start (ap, format); - ret = vsprintf (str, format, ap); + ret = vlc_vsprintf (str, format, ap); va_end (ap); return ret; } @@ -170,10 +174,12 @@ static inline int vlc_snprintf (char *str, size_t size, const char *format, ...) va_list ap; int ret; va_start (ap, format); - ret = vsnprintf (str, size, format, ap); + ret = vlc_vsnprintf (str, size, format, ap); va_end (ap); return ret; } +/* win32: snprintf must always be vlc_snprintf or _snprintf, + * see comment in vlc_vsnprintf */ # define snprintf vlc_snprintf /* Make sure we don't use flawed vasprintf or asprintf either */