mirror of
https://github.com/moparisthebest/curl
synced 2025-02-28 17:31:46 -05:00
snprintf() made a single-byte buffer overflow, as it could write a zero
outside its given buffer. Discovered and reported by James Bursa.
This commit is contained in:
parent
245ab7c796
commit
4cccceb034
@ -961,41 +961,38 @@ static int addbyter(int output, FILE *data)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int curl_mvsnprintf(char *buffer, size_t maxlength, const char *format,
|
||||||
|
va_list ap_save)
|
||||||
|
{
|
||||||
|
int retcode;
|
||||||
|
struct nsprintf info;
|
||||||
|
|
||||||
|
info.buffer = buffer;
|
||||||
|
info.length = 0;
|
||||||
|
info.max = maxlength;
|
||||||
|
|
||||||
|
retcode = dprintf_formatf(&info, addbyter, format, ap_save);
|
||||||
|
if(info.max) {
|
||||||
|
/* we terminate this with a zero byte */
|
||||||
|
if(info.max == info.length)
|
||||||
|
/* we're at maximum, scrap the last letter */
|
||||||
|
info.buffer[-1] = 0;
|
||||||
|
else
|
||||||
|
info.buffer[0] = 0;
|
||||||
|
}
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
|
||||||
int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...)
|
int curl_msnprintf(char *buffer, size_t maxlength, const char *format, ...)
|
||||||
{
|
{
|
||||||
|
int retcode;
|
||||||
va_list ap_save; /* argument pointer */
|
va_list ap_save; /* argument pointer */
|
||||||
int retcode;
|
|
||||||
struct nsprintf info;
|
|
||||||
|
|
||||||
info.buffer = buffer;
|
|
||||||
info.length = 0;
|
|
||||||
info.max = maxlength;
|
|
||||||
|
|
||||||
va_start(ap_save, format);
|
va_start(ap_save, format);
|
||||||
retcode = dprintf_formatf(&info, addbyter, format, ap_save);
|
retcode = curl_mvsnprintf(buffer, maxlength, format, ap_save);
|
||||||
va_end(ap_save);
|
va_end(ap_save);
|
||||||
info.buffer[0] = 0; /* we terminate this with a zero byte */
|
|
||||||
|
|
||||||
/* we could even return things like */
|
|
||||||
|
|
||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int curl_mvsnprintf(char *buffer, size_t maxlength, const char *format, va_list ap_save)
|
|
||||||
{
|
|
||||||
int retcode;
|
|
||||||
struct nsprintf info;
|
|
||||||
|
|
||||||
info.buffer = buffer;
|
|
||||||
info.length = 0;
|
|
||||||
info.max = maxlength;
|
|
||||||
|
|
||||||
retcode = dprintf_formatf(&info, addbyter, format, ap_save);
|
|
||||||
info.buffer[0] = 0; /* we terminate this with a zero byte */
|
|
||||||
return retcode;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* fputc() look-alike */
|
/* fputc() look-alike */
|
||||||
static int alloc_addbyter(int output, FILE *data)
|
static int alloc_addbyter(int output, FILE *data)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user