1
0
mirror of https://github.com/moparisthebest/curl synced 2024-11-15 14:05:03 -05:00

mprintf: return error on too many arguments

128 arguments should be enough for everyone
This commit is contained in:
Daniel Stenberg 2016-10-08 20:47:04 +02:00
parent 8238ba9c5f
commit 71588c9aef

View File

@ -227,10 +227,12 @@ static bool dprintf_IsQualifierNoDollar(const char *fmt)
* Create an index with the type of each parameter entry and its * Create an index with the type of each parameter entry and its
* value (may vary in size) * value (may vary in size)
* *
* Returns zero on success.
*
******************************************************************/ ******************************************************************/
static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos, static int dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
va_list arglist) va_list arglist)
{ {
char *fmt = (char *)format; char *fmt = (char *)format;
int param_num = 0; int param_num = 0;
@ -393,6 +395,10 @@ static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
i = this_param - 1; i = this_param - 1;
if((i < 0) || (i >= MAX_PARAMETERS))
/* out of allowed range */
return 1;
switch (*fmt) { switch (*fmt) {
case 'S': case 'S':
flags |= FLAGS_ALT; flags |= FLAGS_ALT;
@ -549,7 +555,7 @@ static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
} }
} }
return max_param; return 0;
} }
@ -587,7 +593,8 @@ static int dprintf_formatf(
char *workend = &work[sizeof(work) - 2]; char *workend = &work[sizeof(work) - 2];
/* Do the actual %-code parsing */ /* Do the actual %-code parsing */
dprintf_Pass1(format, vto, endpos, ap_save); if(dprintf_Pass1(format, vto, endpos, ap_save))
return -1;
end = &endpos[0]; /* the initial end-position from the list dprintf_Pass1() end = &endpos[0]; /* the initial end-position from the list dprintf_Pass1()
created for us */ created for us */
@ -992,7 +999,7 @@ int curl_mvsnprintf(char *buffer, size_t maxlength, const char *format,
info.max = maxlength; info.max = maxlength;
retcode = dprintf_formatf(&info, addbyter, format, ap_save); retcode = dprintf_formatf(&info, addbyter, format, ap_save);
if(info.max) { if((retcode != -1) && info.max) {
/* we terminate this with a zero byte */ /* we terminate this with a zero byte */
if(info.max == info.length) if(info.max == info.length)
/* we're at maximum, scrap the last letter */ /* we're at maximum, scrap the last letter */