Warn about non well-formed arguments in bcmath

Co-Authored-By: Nikita Popov <nikita.ppv@googlemail.com>
Co-Authored-By: Christoph M. Becker <cmbecker69@gmx.de>
This commit is contained in:
vladyslavstartsev 2019-04-30 17:33:04 +03:00 committed by Nikita Popov
parent 3f19f5112a
commit a07d422ade
7 changed files with 93 additions and 10 deletions

View File

@ -41,6 +41,10 @@ PHP 7.4 UPGRADE NOTES
consistently disallowed now. Previously this worked if the right hand side
was a simple (CV) variable and did not occur as part of the list().
- BCMath:
. BCMath functions will now warn if a non well-formed number is passed, such
as "32foo". The argument will be interpreted as zero (as before).
- Curl:
. Attempting to serialize a CURLFile class will now generate an exception.
Previously the exception was only thrown on unserialization.

View File

@ -198,11 +198,15 @@ static void php_str2num(bc_num *num, char *str)
char *p;
if (!(p = strchr(str, '.'))) {
bc_str2num(num, str, 0);
if (!bc_str2num(num, str, 0)) {
php_error_docref(NULL, E_WARNING, "bcmath function argument is not well-formed");
}
return;
}
bc_str2num(num, str, strlen(p+1));
if (!bc_str2num(num, str, strlen(p+1))) {
php_error_docref(NULL, E_WARNING, "bcmath function argument is not well-formed");
}
}
/* }}} */
@ -527,8 +531,12 @@ PHP_FUNCTION(bccomp)
bc_init_num(&first);
bc_init_num(&second);
bc_str2num(&first, ZSTR_VAL(left), scale);
bc_str2num(&second, ZSTR_VAL(right), scale);
if (!bc_str2num(&first, ZSTR_VAL(left), scale)) {
php_error_docref(NULL, E_WARNING, "bcmath function argument is not well-formed");
}
if (!bc_str2num(&second, ZSTR_VAL(right), scale)) {
php_error_docref(NULL, E_WARNING, "bcmath function argument is not well-formed");
}
RETVAL_LONG(bc_compare(first, second));
bc_free_num(&first);

View File

@ -108,7 +108,7 @@ _PROTOTYPE(bc_num bc_copy_num, (bc_num num));
_PROTOTYPE(void bc_init_num, (bc_num *num));
_PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale));
_PROTOTYPE(int bc_str2num, (bc_num *num, char *str, int scale));
_PROTOTYPE(zend_string *bc_num2str_ex, (bc_num num, int scale));

View File

@ -39,7 +39,7 @@
/* Convert strings to bc numbers. Base 10 only.*/
void
int
bc_str2num (bc_num *num, char *str, int scale)
{
int digits, strscale;
@ -62,7 +62,7 @@ bc_str2num (bc_num *num, char *str, int scale)
if ((*ptr != '\0') || (digits+strscale == 0))
{
*num = bc_copy_num (BCG(_zero_));
return;
return *ptr == '\0';
}
/* Adjust numbers and allocate storage and initialize fields. */
@ -107,4 +107,6 @@ bc_str2num (bc_num *num, char *str, int scale)
if (bc_is_zero (*num))
(*num)->n_sign = PLUS;
return 1;
}

View File

@ -6,8 +6,8 @@ if (PHP_INT_SIZE != 8) die("skip: 64-bit only"); ?>
--FILE--
<?php
$var48 = bcscale(634314234334311);
$var67 = bcsqrt(false);
$var414 = bcadd(false,null,10);
$var67 = bcsqrt(0);
$var414 = bcadd(0,-1,10);
die('ALIVE');
?>
--EXPECT--

View File

@ -6,7 +6,7 @@ if(!extension_loaded("bcmath")) print "skip";
?>
--FILE--
<?php
var_dump(bcpowmod(1, "A", 128, -200));
var_dump(bcpowmod(1, 0, 128, -200));
var_dump(bcpowmod(1, 1.2, 1, 1));
?>
--EXPECTF--

View File

@ -0,0 +1,69 @@
--TEST--
bcmath lib arguments formatting
--DESCRIPTION--
1 and 2 argument of bcadd/bcsub/bcmul/bcdiv/bcmod/bcpowmod/bcpow/bccomp (last one works different then others internally);
1 argument of bcsqrt
All of the name above must be well-formed
--SKIPIF--
<?php if(!extension_loaded("bcmath")) print "skip"; ?>
--FILE--
<?php
echo bcadd("1", "2"),"\n";
echo bcadd("1.1", "2", 2),"\n";
echo bcadd("", "2", 2),"\n";
echo bcadd("+0", "2"), "\n";
echo bcadd("-0", "2"), "\n";
echo bcadd(" 0", "2");
echo bcadd("1e1", "2");
echo bcadd("1,1", "2");
echo bcadd("Hello", "2");
echo bcadd("1 1", "2");
echo "\n", "\n";
echo bccomp("1", "2"),"\n";
echo bccomp("1.1", "2", 2),"\n";
echo bccomp("", "2"),"\n";
echo bccomp("+0", "2"), "\n";
echo bccomp("-0", "2"), "\n";
echo bccomp(" 0", "2");
echo bccomp("1e1", "2");
echo bccomp("1,1", "2");
echo bccomp("Hello", "2");
echo bccomp("1 1", "2");
?>
--EXPECTF--
3
3.10
2.00
2
2
Warning: bcadd(): bcmath function argument is not well-formed in %s on line %d
2
Warning: bcadd(): bcmath function argument is not well-formed in %s on line %d
2
Warning: bcadd(): bcmath function argument is not well-formed in %s on line %d
2
Warning: bcadd(): bcmath function argument is not well-formed in %s on line %d
2
Warning: bcadd(): bcmath function argument is not well-formed in %s on line %d
2
-1
-1
-1
-1
-1
Warning: bccomp(): bcmath function argument is not well-formed in %s on line %d
-1
Warning: bccomp(): bcmath function argument is not well-formed in %s on line %d
-1
Warning: bccomp(): bcmath function argument is not well-formed in %s on line %d
-1
Warning: bccomp(): bcmath function argument is not well-formed in %s on line %d
-1
Warning: bccomp(): bcmath function argument is not well-formed in %s on line %d
-1