summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-10-29 13:05:02 +0100
committerNikita Popov <nikita.ppv@gmail.com>2019-10-29 13:05:02 +0100
commit26327bcd3b6375a4883f00a289ba129e5b23717d (patch)
tree0ec16fe8034692b364af3c9c3d4f7f7bed9e0bf0
parent8f20b9969fb431cebc329995782631e8b5ecf6c2 (diff)
downloadphp-git-26327bcd3b6375a4883f00a289ba129e5b23717d.tar.gz
Throw "Unsupported operand types" error when using ** on arrays
-rw-r--r--Zend/tests/bug74084.phpt9
-rw-r--r--Zend/tests/pow_array_leak.phpt24
-rw-r--r--Zend/zend_operators.c39
-rw-r--r--ext/standard/tests/math/pow_variation1.phpt12
-rw-r--r--ext/standard/tests/math/pow_variation1_64bit.phpt12
-rw-r--r--ext/standard/tests/math/pow_variation2.phpt12
6 files changed, 62 insertions, 46 deletions
diff --git a/Zend/tests/bug74084.phpt b/Zend/tests/bug74084.phpt
index 108f03be36..ab4dce0a5a 100644
--- a/Zend/tests/bug74084.phpt
+++ b/Zend/tests/bug74084.phpt
@@ -24,11 +24,14 @@ try {
echo $e->getMessage(), "\n";
}
unset($$A);
-$$A **= $$B['a'] = &$$C;
-var_dump($$A);
+try {
+ $$A **= $$B['a'] = &$$C;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
?>
--EXPECT--
Unsupported operand types
Unsupported operand types
Unsupported operand types
-int(0)
+Unsupported operand types
diff --git a/Zend/tests/pow_array_leak.phpt b/Zend/tests/pow_array_leak.phpt
index e9165bbbc5..a17a290458 100644
--- a/Zend/tests/pow_array_leak.phpt
+++ b/Zend/tests/pow_array_leak.phpt
@@ -4,14 +4,30 @@ Memory leak on ** with result==op1 array
<?php
$x = [0];
-$x **= 1;
+try {
+ $x **= 1;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
var_dump($x);
$x = [0];
-$x **= $x;
+try {
+ $x **= $x;
+} catch (Error $e) {
+ echo $e->getMessage(), "\n";
+}
var_dump($x);
?>
--EXPECT--
-int(0)
-int(0)
+Unsupported operand types
+array(1) {
+ [0]=>
+ int(0)
+}
+Unsupported operand types
+array(1) {
+ [0]=>
+ int(0)
+}
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 69ee522b4c..a1f3024d4e 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -1197,37 +1197,22 @@ ZEND_API int ZEND_FASTCALL pow_function(zval *result, zval *op1, zval *op2) /* {
} else if (!converted) {
ZEND_TRY_BINARY_OBJECT_OPERATION(ZEND_POW, pow_function);
- if (EXPECTED(op1 != op2)) {
- if (Z_TYPE_P(op1) == IS_ARRAY) {
- if (op1 == result) {
- zval_ptr_dtor(result);
- }
- ZVAL_LONG(result, 0);
- return SUCCESS;
- } else {
- op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
- }
- if (Z_TYPE_P(op2) == IS_ARRAY) {
- if (op1 == result) {
- zval_ptr_dtor(result);
- }
- ZVAL_LONG(result, 1L);
- return SUCCESS;
- } else {
- op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0);
+ if (Z_TYPE_P(op1) == IS_ARRAY || Z_TYPE_P(op2) == IS_ARRAY) {
+ if (result != op1) {
+ ZVAL_UNDEF(result);
}
+ zend_throw_error(NULL, "Unsupported operand types");
+ return FAILURE;
+ }
+
+ if (EXPECTED(op1 != op2)) {
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
+ op2 = zendi_convert_scalar_to_number(op2, &op2_copy, result, 0);
} else {
- if (Z_TYPE_P(op1) == IS_ARRAY) {
- if (op1 == result) {
- zval_ptr_dtor(result);
- }
- ZVAL_LONG(result, 0);
- return SUCCESS;
- } else {
- op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
- }
+ op1 = zendi_convert_scalar_to_number(op1, &op1_copy, result, 0);
op2 = op1;
}
+
if (EG(exception)) {
if (result != op1) {
ZVAL_UNDEF(result);
diff --git a/ext/standard/tests/math/pow_variation1.phpt b/ext/standard/tests/math/pow_variation1.phpt
index a3e13d861c..86df8e0eb4 100644
--- a/ext/standard/tests/math/pow_variation1.phpt
+++ b/ext/standard/tests/math/pow_variation1.phpt
@@ -84,9 +84,13 @@ $inputs = array(
// loop through each element of $inputs to check the behaviour of pow()
$iterator = 1;
foreach($inputs as $input) {
- echo "\n-- Iteration $iterator --\n";
- var_dump(pow($input, 3));
- $iterator++;
+ echo "\n-- Iteration $iterator --\n";
+ try {
+ var_dump(pow($input, 3));
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ $iterator++;
};
fclose($fp);
?>
@@ -153,7 +157,7 @@ Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 19 --
-int(0)
+Unsupported operand types
-- Iteration 20 --
diff --git a/ext/standard/tests/math/pow_variation1_64bit.phpt b/ext/standard/tests/math/pow_variation1_64bit.phpt
index 0d8b1960be..da63ae3d9f 100644
--- a/ext/standard/tests/math/pow_variation1_64bit.phpt
+++ b/ext/standard/tests/math/pow_variation1_64bit.phpt
@@ -84,9 +84,13 @@ $inputs = array(
// loop through each element of $inputs to check the behaviour of pow()
$iterator = 1;
foreach($inputs as $input) {
- echo "\n-- Iteration $iterator --\n";
- var_dump(pow($input, 3));
- $iterator++;
+ echo "\n-- Iteration $iterator --\n";
+ try {
+ var_dump(pow($input, 3));
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ $iterator++;
};
fclose($fp);
?>
@@ -153,7 +157,7 @@ Warning: A non-numeric value encountered in %s on line %d
int(0)
-- Iteration 19 --
-int(0)
+Unsupported operand types
-- Iteration 20 --
diff --git a/ext/standard/tests/math/pow_variation2.phpt b/ext/standard/tests/math/pow_variation2.phpt
index 4876447da9..83d1fda065 100644
--- a/ext/standard/tests/math/pow_variation2.phpt
+++ b/ext/standard/tests/math/pow_variation2.phpt
@@ -80,9 +80,13 @@ $inputs = array(
// loop through each element of $inputs to check the behaviour of pow()
$iterator = 1;
foreach($inputs as $input) {
- echo "\n-- Iteration $iterator --\n";
- var_dump(pow(20.3, $input));
- $iterator++;
+ echo "\n-- Iteration $iterator --\n";
+ try {
+ var_dump(pow(20.3, $input));
+ } catch (Error $e) {
+ echo $e->getMessage(), "\n";
+ }
+ $iterator++;
};
fclose($fp);
?>
@@ -149,7 +153,7 @@ Warning: A non-numeric value encountered in %s on line %d
float(1)
-- Iteration 19 --
-int(1)
+Unsupported operand types
-- Iteration 20 --