Re: printf argument "swapping" patch
| From: | Morten Poulsen | Date: | Fri, 06 Apr 2001 16:25:30 +0000 |
| Subject: | Re: printf argument "swapping" patch | ||
| References: | 1 2 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-51053@lists.php.net to get a copy of this message | ||
Morten Poulsen <mortenp@certus.dk> said:
> i'll fix it and send a new patch, sorry..
Allright, here is the new patch. Sorry about all the fuzz.
Greetings,
Morten
--
mortenp
Thus spake the master programmer: "Let the programmers be many and the
managers few -- then all will be productive."
diff -ur php-4.0.4pl1.orig/ext/standard/formatted_print.c php-4.0.4pl1/ext/standard/formatted_print.c --- php-4.0.4pl1.orig/ext/standard/formatted_print.c Fri Apr 6 16:07:49 2001 +++ php-4.0.4pl1/ext/standard/formatted_print.c Fri Apr 6 18:19:38 2001 @@ -391,7 +391,7 @@ { pval ***args; int argc, size = 240, inpos = 0, outpos = 0; - int alignment, width, precision, currarg, adjusting; + int alignment, width, precision, currarg, adjusting, argnum, tempnum; char *format, *result, padding; argc = ZEND_NUM_ARGS(); @@ -459,17 +459,38 @@ (alignment == ALIGN_LEFT) ? "left" : "right")); - /* after modifiers comes width */ + /* after modifiers comes width or argnum */ if (isdigit((int)format[inpos])) { - PRINTF_DEBUG(("sprintf: getting width\n")); - width = php_sprintf_getnumber(format, &inpos); - adjusting |= ADJ_WIDTH; + PRINTF_DEBUG(("sprintf: getting width or argnum\n")); + tempnum = php_sprintf_getnumber(format, &inpos); + if (format[inpos] == '$') { + argnum = tempnum; + inpos++; /* skip the '$' */ + if (isdigit((int)format[inpos])) { + width = php_sprintf_getnumber(format, &inpos); + adjusting |= ADJ_WIDTH; + } else { + width = 0; + } + } else { + argnum = currarg++; + width = tempnum; + adjusting |= ADJ_WIDTH; + } } else { + argnum = currarg++; width = 0; } PRINTF_DEBUG(("sprintf: width=%d\n", width)); - /* after width comes precision */ + if (argnum >= argc) { + efree(result); + efree(args); + php_error(E_WARNING, "%s(): too few arguments",get_active_function_name()); + return NULL; + } + + /* after width and argnum comes precision */ if (format[inpos] == '.') { inpos++; PRINTF_DEBUG(("sprintf: getting precision\n")); @@ -486,6 +507,7 @@ PRINTF_DEBUG(("sprintf: precision=%d\n", precision)); } else { width = precision = 0; + argnum = currarg++; } if (format[inpos] == 'l') { @@ -495,67 +517,67 @@ /* now we expect to find a type specifier */ switch (format[inpos]) { case 's': - convert_to_string_ex(args[currarg]); + convert_to_string_ex(args[argnum]); php_sprintf_appendstring(&result, &outpos, &size, - (*args[currarg])->value.str.val, + (*args[argnum])->value.str.val, width, precision, padding, alignment, - (*args[currarg])->value.str.len, + (*args[argnum])->value.str.len, 0, expprec); break; case 'd': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_appendint(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment); break; case 'e': case 'f': /* XXX not done */ - convert_to_double_ex(args[currarg]); + convert_to_double_ex(args[argnum]); php_sprintf_appenddouble(&result, &outpos, &size, - (*args[currarg])->value.dval, + (*args[argnum])->value.dval, width, padding, alignment, precision, adjusting, format[inpos]); break; case 'c': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_appendchar(&result, &outpos, &size, - (char) (*args[currarg])->value.lval); + (char) (*args[argnum])->value.lval); break; case 'o': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 3, hexchars, expprec); break; case 'x': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 4, hexchars, expprec); break; case 'X': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 4, HEXCHARS, expprec); break; case 'b': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 1, hexchars, expprec); break; @@ -567,7 +589,6 @@ default: break; } - currarg++; inpos++; } }
diff -ur php-4.0.4pl1.orig/ext/standard/formatted_print.c php-4.0.4pl1/ext/standard/formatted_print.c --- php-4.0.4pl1.orig/ext/standard/formatted_print.c Fri Apr 6 16:07:49 2001 +++ php-4.0.4pl1/ext/standard/formatted_print.c Fri Apr 6 18:19:38 2001 @@ -391,7 +391,7 @@ { pval ***args; int argc, size = 240, inpos = 0, outpos = 0; - int alignment, width, precision, currarg, adjusting; + int alignment, width, precision, currarg, adjusting, argnum, tempnum; char *format, *result, padding; argc = ZEND_NUM_ARGS(); @@ -459,17 +459,38 @@ (alignment == ALIGN_LEFT) ? "left" : "right")); - /* after modifiers comes width */ + /* after modifiers comes width or argnum */ if (isdigit((int)format[inpos])) { - PRINTF_DEBUG(("sprintf: getting width\n")); - width = php_sprintf_getnumber(format, &inpos); - adjusting |= ADJ_WIDTH; + PRINTF_DEBUG(("sprintf: getting width or argnum\n")); + tempnum = php_sprintf_getnumber(format, &inpos); + if (format[inpos] == '$') { + argnum = tempnum; + inpos++; /* skip the '$' */ + if (isdigit((int)format[inpos])) { + width = php_sprintf_getnumber(format, &inpos); + adjusting |= ADJ_WIDTH; + } else { + width = 0; + } + } else { + argnum = currarg++; + width = tempnum; + adjusting |= ADJ_WIDTH; + } } else { + argnum = currarg++; width = 0; } PRINTF_DEBUG(("sprintf: width=%d\n", width)); - /* after width comes precision */ + if (argnum >= argc) { + efree(result); + efree(args); + php_error(E_WARNING, "%s(): too few arguments",get_active_function_name()); + return NULL; + } + + /* after width and argnum comes precision */ if (format[inpos] == '.') { inpos++; PRINTF_DEBUG(("sprintf: getting precision\n")); @@ -486,6 +507,7 @@ PRINTF_DEBUG(("sprintf: precision=%d\n", precision)); } else { width = precision = 0; + argnum = currarg++; } if (format[inpos] == 'l') { @@ -495,67 +517,67 @@ /* now we expect to find a type specifier */ switch (format[inpos]) { case 's': - convert_to_string_ex(args[currarg]); + convert_to_string_ex(args[argnum]); php_sprintf_appendstring(&result, &outpos, &size, - (*args[currarg])->value.str.val, + (*args[argnum])->value.str.val, width, precision, padding, alignment, - (*args[currarg])->value.str.len, + (*args[argnum])->value.str.len, 0, expprec); break; case 'd': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_appendint(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment); break; case 'e': case 'f': /* XXX not done */ - convert_to_double_ex(args[currarg]); + convert_to_double_ex(args[argnum]); php_sprintf_appenddouble(&result, &outpos, &size, - (*args[currarg])->value.dval, + (*args[argnum])->value.dval, width, padding, alignment, precision, adjusting, format[inpos]); break; case 'c': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_appendchar(&result, &outpos, &size, - (char) (*args[currarg])->value.lval); + (char) (*args[argnum])->value.lval); break; case 'o': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 3, hexchars, expprec); break; case 'x': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 4, hexchars, expprec); break; case 'X': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 4, HEXCHARS, expprec); break; case 'b': - convert_to_long_ex(args[currarg]); + convert_to_long_ex(args[argnum]); php_sprintf_append2n(&result, &outpos, &size, - (*args[currarg])->value.lval, + (*args[argnum])->value.lval, width, padding, alignment, 1, hexchars, expprec); break; @@ -567,7 +589,6 @@ default: break; } - currarg++; inpos++; } }