summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-01-26 12:50:28 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-01-26 12:51:02 +0100
commit776726da0387daa190b2a27733800a556f6dc4b6 (patch)
tree84469af804cb0b3ec58af0b4b51cc16016814821
parent1954e5975846b3952ce1d2d6506e6d7134c89684 (diff)
downloadphp-git-776726da0387daa190b2a27733800a556f6dc4b6.tar.gz
Add missing resource key warning for unset()
It was present on other operations, including isset(), but was missing for unset().
-rw-r--r--Zend/tests/resource_key.phpt36
-rw-r--r--Zend/zend_vm_def.h1
-rw-r--r--Zend/zend_vm_execute.h6
3 files changed, 43 insertions, 0 deletions
diff --git a/Zend/tests/resource_key.phpt b/Zend/tests/resource_key.phpt
new file mode 100644
index 0000000000..fddd41bcad
--- /dev/null
+++ b/Zend/tests/resource_key.phpt
@@ -0,0 +1,36 @@
+--TEST--
+Behavior of resources as array keys
+--FILE--
+<?php
+
+$r = fopen(__FILE__, 'r');
+$a = [];
+echo "Assign:";
+$a[$r] = 1;
+echo "Add assign:";
+$a[$r] += 1;
+echo "Inc:";
+$a[$r]++;
+echo "Get:";
+var_dump($a[$r]);
+echo "Isset:";
+var_dump(isset($a[$r]));
+echo "Unset:";
+unset($a[$r]);
+
+?>
+--EXPECTF--
+Assign:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+Add assign:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+Inc:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+Get:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+int(3)
+Isset:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
+bool(true)
+Unset:
+Warning: Resource ID#%d used as offset, casting to integer (%d) in %s on line %d
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 60b1ac3b90..e55e5d02e2 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -6396,6 +6396,7 @@ ZEND_VM_C_LABEL(num_index_dim):
hval = 1;
ZEND_VM_C_GOTO(num_index_dim);
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
ZEND_VM_C_GOTO(num_index_dim);
} else if (OP2_TYPE == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 2046afba55..fc77948f6b 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -24382,6 +24382,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -26532,6 +26533,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -30543,6 +30545,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -41807,6 +41810,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CONST == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -45250,6 +45254,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if ((IS_TMP_VAR|IS_VAR) == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {
@@ -50372,6 +50377,7 @@ num_index_dim:
hval = 1;
goto num_index_dim;
} else if (Z_TYPE_P(offset) == IS_RESOURCE) {
+ zend_use_resource_as_offset(offset);
hval = Z_RES_HANDLE_P(offset);
goto num_index_dim;
} else if (IS_CV == IS_CV && Z_TYPE_P(offset) == IS_UNDEF) {