Commit 151982aa authored by David Flynn's avatar David Flynn Committed by Jean-Baptiste Kempf

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: default avatarDavid Flynn <davidf@rd.bbc.co.uk>
Signed-off-by: default avatarJean-Baptiste Kempf <jb@videolan.org>
parent ca5043b4
...@@ -124,7 +124,11 @@ static inline int vlc_vsprintf (char *str, const char *format, va_list ap) ...@@ -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) static inline int vlc_vsnprintf (char *str, size_t size, const char *format, va_list ap)
{ {
char *fmt = vlc_fix_format_string (format); 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); free (fmt);
return ret; return ret;
} }
...@@ -135,7 +139,7 @@ static inline int vlc_printf (const char *format, ...) ...@@ -135,7 +139,7 @@ static inline int vlc_printf (const char *format, ...)
va_list ap; va_list ap;
int ret; int ret;
va_start (ap, format); va_start (ap, format);
ret = vprintf (format, ap); ret = vlc_vprintf (format, ap);
va_end (ap); va_end (ap);
return ret; return ret;
} }
...@@ -146,7 +150,7 @@ static inline int vlc_fprintf (FILE *stream, const char *format, ...) ...@@ -146,7 +150,7 @@ static inline int vlc_fprintf (FILE *stream, const char *format, ...)
va_list ap; va_list ap;
int ret; int ret;
va_start (ap, format); va_start (ap, format);
ret = vfprintf (stream, format, ap); ret = vlc_vfprintf (stream, format, ap);
va_end (ap); va_end (ap);
return ret; return ret;
} }
...@@ -158,7 +162,7 @@ static inline int vlc_sprintf (char *str, const char *format, ...) ...@@ -158,7 +162,7 @@ static inline int vlc_sprintf (char *str, const char *format, ...)
va_list ap; va_list ap;
int ret; int ret;
va_start (ap, format); va_start (ap, format);
ret = vsprintf (str, format, ap); ret = vlc_vsprintf (str, format, ap);
va_end (ap); va_end (ap);
return ret; return ret;
} }
...@@ -170,10 +174,12 @@ static inline int vlc_snprintf (char *str, size_t size, const char *format, ...) ...@@ -170,10 +174,12 @@ static inline int vlc_snprintf (char *str, size_t size, const char *format, ...)
va_list ap; va_list ap;
int ret; int ret;
va_start (ap, format); va_start (ap, format);
ret = vsnprintf (str, size, format, ap); ret = vlc_vsnprintf (str, size, format, ap);
va_end (ap); va_end (ap);
return ret; return ret;
} }
/* win32: snprintf must always be vlc_snprintf or _snprintf,
* see comment in vlc_vsnprintf */
# define snprintf vlc_snprintf # define snprintf vlc_snprintf
/* Make sure we don't use flawed vasprintf or asprintf either */ /* Make sure we don't use flawed vasprintf or asprintf either */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment