summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2016-04-26 13:04:06 +0300
committerDmitry Stogov <dmitry@zend.com>2016-04-26 13:04:06 +0300
commit8f0ceb97cff0defa74294c5580e93386897b4933 (patch)
tree752bde7b669aa8e77b551da65f4e1fa7d6a1117d
parent92233dd736a883c34d5769081a9c0ff6d9f264f7 (diff)
downloadphp-git-8f0ceb97cff0defa74294c5580e93386897b4933.tar.gz
Fixed bug #72100 (implode() inserts garbage into resulting string when joins very big integer). (Mikhail Galanin)
-rw-r--r--NEWS2
-rw-r--r--ext/standard/string.c12
-rw-r--r--ext/standard/tests/strings/bug72100.phpt18
3 files changed, 26 insertions, 6 deletions
diff --git a/NEWS b/NEWS
index 9330bce211..5e5ae2ff26 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,8 @@ PHP NEWS
- Core:
. Fixed bug #72101 (crash on complex code). (Dmitry)
+ . Fixed bug #72100 (implode() inserts garbage into resulting string when
+ joins very big integer). (Mikhail Galanin)
. Fixed bug #72057 (PHP Hangs when using custom error handler and typehint).
(Nikita Nefedov)
. Fixed bug #72038 (Function calls with values to a by-ref parameter don't
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 3f47e73c1d..7ee918c2fe 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -1229,16 +1229,16 @@ PHPAPI void php_implode(const zend_string *delim, zval *arr, zval *return_value)
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(arr), tmp) {
if (Z_TYPE_P(tmp) == IS_LONG) {
- double val = Z_LVAL_P(tmp);
+ zend_long val = Z_LVAL_P(tmp);
+
*++strptr = NULL;
((zend_long *) (strings + numelems))[strptr - strings] = Z_LVAL_P(tmp);
- if (val < 0) {
- val = -10 * val;
+ if (val <= 0) {
+ len++;
}
- if (val < 10) {
+ while (val) {
+ val /= 10;
len++;
- } else {
- len += (int) log10(10 * (double) val);
}
} else {
*++strptr = zval_get_string(tmp);
diff --git a/ext/standard/tests/strings/bug72100.phpt b/ext/standard/tests/strings/bug72100.phpt
new file mode 100644
index 0000000000..7fcc0831b6
--- /dev/null
+++ b/ext/standard/tests/strings/bug72100.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Test implode() function, problems with big numbers
+--SKIPIF--
+<?php
+if (PHP_INT_SIZE != 8) die("skip this test is for 64bit platform only");
+?>
+--FILE--
+<?php
+var_dump( implode(" ", ["hello long", 999999999999999999, PHP_INT_MAX]));
+var_dump( implode(" ", ["hello negative long", -999999999999999999, PHP_INT_MIN] ) );
+var_dump( implode(" ", ["hello small long", -101, -100, -99, -90, -11, -10, -9, -1, 0, 1, 2, 9, 10, 11, 90, 99, 100, 101] ) );
+echo "Done\n";
+?>
+--EXPECT--
+string(49) "hello long 999999999999999999 9223372036854775807"
+string(60) "hello negative long -999999999999999999 -9223372036854775808"
+string(76) "hello small long -101 -100 -99 -90 -11 -10 -9 -1 0 1 2 9 10 11 90 99 100 101"
+Done