summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibault "bui" Koechlin2018-01-26 18:35:40 +0100
committerjvoisin2018-01-26 18:35:40 +0100
commitc853c3fcc7ba2efbf78ef80b46dddda57d132510 (patch)
tree918e818e8b3d5337999fdd4ba44a57c140bf7b67
parenta5b0956aa6bf91912dd8127b9b5e9f76f7f4730e (diff)
Fix a segfault in `get_local_var` (#138)
This commit fixes a segfault where 'get_local_var' would fail if no functions where called yet (`symtable` will be NULL)
-rw-r--r--src/sp_var_value.c5
-rw-r--r--src/tests/disabled_function_local_var_crash.phpt18
2 files changed, 23 insertions, 0 deletions
diff --git a/src/sp_var_value.c b/src/sp_var_value.c
index a3eed3e..05598bf 100644
--- a/src/sp_var_value.c
+++ b/src/sp_var_value.c
@@ -27,6 +27,11 @@ static zval *get_local_var(zend_execute_data *ed, const char *var_name) {
27 EG(current_execute_data) = current; 27 EG(current_execute_data) = current;
28 zend_array *symtable = zend_rebuild_symbol_table(); 28 zend_array *symtable = zend_rebuild_symbol_table();
29 29
30 if (UNEXPECTED(symtable == NULL)) {
31 EG(current_execute_data) = orig_execute_data;
32 return NULL;
33 }
34
30 ZEND_HASH_FOREACH_STR_KEY_VAL(symtable, key, value) { 35 ZEND_HASH_FOREACH_STR_KEY_VAL(symtable, key, value) {
31 if (0 == strcmp(var_name, key->val)) { 36 if (0 == strcmp(var_name, key->val)) {
32 if (Z_TYPE_P(value) == IS_INDIRECT) { 37 if (Z_TYPE_P(value) == IS_INDIRECT) {
diff --git a/src/tests/disabled_function_local_var_crash.phpt b/src/tests/disabled_function_local_var_crash.phpt
new file mode 100644
index 0000000..8dec946
--- /dev/null
+++ b/src/tests/disabled_function_local_var_crash.phpt
@@ -0,0 +1,18 @@
1--TEST--
2Disable functions - match on a local variable
3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus")) die "skip"; ?>
5--INI--
6sp.configuration_file={PWD}/config/disabled_function_local_var.ini
7--FILE--
8<?php
9function test(){
10 echo strlen("id") . "\n";
11}
12ob_start(test());
13echo "test\n";
14?>
15--EXPECTF--
162
17test
18