|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2012-03-27 21:07 UTC] iblue at gmx dot net
Description:
------------
There is an integer overflow in *printf.
Test script:
---------------
<?php
echo sprintf('%2147483646$s', "foo");
echo sprintf('%2147483647$s', "foo");
Expected result:
----------------
PHP Warning: sprintf(): Too few arguments in /home/iblue/test.php on line 2
PHP Warning: sprintf(): Too few arguments in /home/iblue/test.php on line 3
Actual result:
--------------
PHP Warning: sprintf(): Too few arguments in /home/iblue/test.php on line 2
PHP Warning: sprintf(): Argument number must be greater than zero in
/home/iblue/test.php on line 3
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 17 18:00:01 2025 UTC |
This happens because argnum is int and php_sprintf_getnumber() just returns -1 when there is overflow. ext/standard/formatted_print.c --------- if (format[temppos] == '$') { argnum = php_sprintf_getnumber(format, &inpos); if (argnum <= 0) { efree(result); efree(args); php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument number must be greater than zero"); return NULL; } multiuse = 1; inpos++; /* skip the '$' */ } else { ------------- I don't think we have to deal this more gracefully. Anyone?