From 1fd32e9c2f15eabdc7e531b1fa76f62fc5a8ca75 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 11 Mar 2019 15:35:02 +0100 Subject: [PATCH] Fixed bug #76717 Print INT_MIN as -INT_MAX-1 to avoid it getting parsed as a float literal due to integer overflow. --- NEWS | 2 ++ ext/standard/tests/general_functions/bug76717.phpt | 14 ++++++++++++++ ext/standard/var.c | 7 +++++++ 3 files changed, 23 insertions(+) create mode 100644 ext/standard/tests/general_functions/bug76717.phpt diff --git a/NEWS b/NEWS index ffd0bacccb..967fed2918 100644 --- a/NEWS +++ b/NEWS @@ -37,6 +37,8 @@ PHP NEWS custom wrapper). (Laruence) . Fixed bug #77669 (Crash in extract() when overwriting extracted array). (Nikita) + . Fixed bug #76717 (var_export() does not create a parsable value for + PHP_INT_MIN). (Nikita) 07 Mar 2019, PHP 7.2.16 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-- + +--EXPECT-- +bool(true) +bool(true) diff --git a/ext/standard/var.c b/ext/standard/var.c index a5a88b634d..0301605610 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -459,6 +459,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: -- 2.50.1