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 <davidf@rd.bbc.co.uk>
Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
static inline int vlc_vsnprintf (char *str, size_t size, const char *format, va_list ap)
{
char *fmt = vlc_fix_format_string (format);
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;
}
free (fmt);
return ret;
}
va_list ap;
int ret;
va_start (ap, format);
va_list ap;
int ret;
va_start (ap, format);
- ret = vprintf (format, ap);
+ ret = vlc_vprintf (format, ap);
va_end (ap);
return ret;
}
va_end (ap);
return ret;
}
va_list ap;
int ret;
va_start (ap, 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;
}
va_end (ap);
return ret;
}
va_list ap;
int ret;
va_start (ap, 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;
}
va_end (ap);
return ret;
}
va_list ap;
int ret;
va_start (ap, 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;
}
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 */
# define snprintf vlc_snprintf
/* Make sure we don't use flawed vasprintf or asprintf either */