summaryrefslogtreecommitdiff
path: root/ext/bcmath
diff options
context:
space:
mode:
authorvladyslavstartsev <vladyslavstartsev@gmail.com>2019-04-30 17:33:04 +0300
committerNikita Popov <nikita.ppv@gmail.com>2019-05-14 15:04:21 +0200
commita07d422ade48e875740a6733543179e7f67a573e (patch)
tree8c6e68b23335d831c6ae5a1e203d080cd10bdc59 /ext/bcmath
parent3f19f5112a7be3e4aa7ab1704d25de54645be373 (diff)
downloadphp-git-a07d422ade48e875740a6733543179e7f67a573e.tar.gz
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>
Diffstat (limited to 'ext/bcmath')
-rw-r--r--ext/bcmath/bcmath.c16
-rw-r--r--ext/bcmath/libbcmath/src/bcmath.h2
-rw-r--r--ext/bcmath/libbcmath/src/str2num.c6
-rw-r--r--ext/bcmath/tests/bug60377.phpt4
-rw-r--r--ext/bcmath/tests/bug72093.phpt2
-rw-r--r--ext/bcmath/tests/str2num_formatting.phpt69
6 files changed, 89 insertions, 10 deletions
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c
index 33be8465c2..ecfce4f54d 100644
--- a/ext/bcmath/bcmath.c
+++ b/ext/bcmath/bcmath.c
@@ -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);
diff --git a/ext/bcmath/libbcmath/src/bcmath.h b/ext/bcmath/libbcmath/src/bcmath.h
index cf6f854c52..becba7ec3e 100644
--- a/ext/bcmath/libbcmath/src/bcmath.h
+++ b/ext/bcmath/libbcmath/src/bcmath.h
@@ -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));
diff --git a/ext/bcmath/libbcmath/src/str2num.c b/ext/bcmath/libbcmath/src/str2num.c
index 0ea37d855f..f2d6a73501 100644
--- a/ext/bcmath/libbcmath/src/str2num.c
+++ b/ext/bcmath/libbcmath/src/str2num.c
@@ -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;
}
diff --git a/ext/bcmath/tests/bug60377.phpt b/ext/bcmath/tests/bug60377.phpt
index 929790d16a..eb140d92cf 100644
--- a/ext/bcmath/tests/bug60377.phpt
+++ b/ext/bcmath/tests/bug60377.phpt
@@ -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--
diff --git a/ext/bcmath/tests/bug72093.phpt b/ext/bcmath/tests/bug72093.phpt
index 3aca87a39c..4295384a30 100644
--- a/ext/bcmath/tests/bug72093.phpt
+++ b/ext/bcmath/tests/bug72093.phpt
@@ -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--
diff --git a/ext/bcmath/tests/str2num_formatting.phpt b/ext/bcmath/tests/str2num_formatting.phpt
new file mode 100644
index 0000000000..090dd44d53
--- /dev/null
+++ b/ext/bcmath/tests/str2num_formatting.phpt
@@ -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 \ No newline at end of file