summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-03-11 15:36:40 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-03-11 15:36:40 +0100
commitcc354a079073061336d8824eebba85042a0de104 (patch)
tree4eaa107295aefb037ad244970fb721a6c7f15477
parentac79d42ba6ed05c5dcb611b66cdad07f3bcbba58 (diff)
parent6818ca3c022d70bd48ac86df8798aa537245935c (diff)
downloadphp-git-cc354a079073061336d8824eebba85042a0de104.tar.gz
Merge branch 'PHP-7.3' into PHP-7.4
-rw-r--r--ext/standard/tests/general_functions/bug76717.phpt14
-rw-r--r--ext/standard/var.c7
2 files changed, 21 insertions, 0 deletions
diff --git a/ext/standard/tests/general_functions/bug76717.phpt b/ext/standard/tests/general_functions/bug76717.phpt
new file mode 100644
index 0000000000..b4bbd04a51
--- /dev/null
+++ b/ext/standard/tests/general_functions/bug76717.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #76717: var_export() does not create a parsable value for PHP_INT_MIN
+--FILE--
+<?php
+
+$min = eval('return '.var_export(PHP_INT_MIN, true).';');
+$max = eval('return '.var_export(PHP_INT_MAX, true).';');
+var_dump($min === PHP_INT_MIN);
+var_dump($max === PHP_INT_MAX);
+
+?>
+--EXPECT--
+bool(true)
+bool(true)
diff --git a/ext/standard/var.c b/ext/standard/var.c
index 06f45c0c73..66150c7274 100644
--- a/ext/standard/var.c
+++ b/ext/standard/var.c
@@ -487,6 +487,13 @@ again:
smart_str_appendl(buf, "NULL", 4);
break;
case IS_LONG:
+ /* INT_MIN as a literal will be parsed as a float. Emit something like
+ * -9223372036854775807-1 to avoid this. */
+ if (Z_LVAL_P(struc) == ZEND_LONG_MIN) {
+ smart_str_append_long(buf, ZEND_LONG_MIN+1);
+ smart_str_appends(buf, "-1");
+ break;
+ }
smart_str_append_long(buf, Z_LVAL_P(struc));
break;
case IS_DOUBLE: