summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorxXx-caillou-xXx2018-08-28 15:21:07 +0200
committerjvoisin2018-08-28 13:21:07 +0000
commit2950b59dad013a0c47e4d38d43db3de759c07cad (patch)
tree4c9d38299f9fdc93ad69d088e05552088b4ed36a /src
parent3e6790044e2c2652f190d528b4403fbb3fa6e565 (diff)
Add array_search and array_keys hooks to kill sloppy comparisons
Diffstat (limited to 'src')
-rw-r--r--src/sp_sloppy.c33
-rw-r--r--src/tests/sloppy_comparison_array.phpt2
-rw-r--r--src/tests/sloppy_comparison_array_disabled.phpt2
-rw-r--r--src/tests/sloppy_comparison_array_keys.phpt20
-rw-r--r--src/tests/sloppy_comparison_array_keys_disabled.phpt22
-rw-r--r--src/tests/sloppy_comparison_array_search.phpt17
-rw-r--r--src/tests/sloppy_comparison_array_search_disabled.phpt15
7 files changed, 102 insertions, 9 deletions
diff --git a/src/sp_sloppy.c b/src/sp_sloppy.c
index 3276233..e7396fd 100644
--- a/src/sp_sloppy.c
+++ b/src/sp_sloppy.c
@@ -36,7 +36,9 @@ ZEND_API zend_op_array* sp_compile_file(zend_file_handle* file_handle,
36 return opline; 36 return opline;
37} 37}
38 38
39PHP_FUNCTION(sp_in_array) { 39static void array_handler(INTERNAL_FUNCTION_PARAMETERS,
40 const char *name, size_t size,
41 void (*orig_handler)(INTERNAL_FUNCTION_PARAMETERS)) {
40 void (*handler)(INTERNAL_FUNCTION_PARAMETERS); 42 void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
41 zval func_name; 43 zval func_name;
42 zval params[3] = {{{0}}}; 44 zval params[3] = {{{0}}};
@@ -48,18 +50,33 @@ PHP_FUNCTION(sp_in_array) {
48 ZVAL_COPY(&params[0], value); 50 ZVAL_COPY(&params[0], value);
49 ZVAL_COPY(&params[1], array); 51 ZVAL_COPY(&params[1], array);
50 ZVAL_BOOL(&params[2], 1); 52 ZVAL_BOOL(&params[2], 1);
51 ZVAL_STRING(&func_name, "in_array"); 53 ZVAL_STRING(&func_name, name);
52 54
53 handler = zend_hash_str_find_ptr( 55 handler = zend_hash_str_find_ptr(
54 SNUFFLEUPAGUS_G(sp_internal_functions_hook), "in_array", sizeof("in_array") - 1); 56 SNUFFLEUPAGUS_G(sp_internal_functions_hook), name, size);
55 zend_internal_function *func = zend_hash_str_find_ptr( 57 zend_internal_function *func = zend_hash_str_find_ptr(
56 CG(function_table), "in_array", sizeof("in_array") - 1); 58 CG(function_table), name, size);
57 func->handler = handler; 59 func->handler = handler;
58 60
59 call_user_function(CG(function_table), NULL, &func_name, return_value, 3, 61 call_user_function(CG(function_table), NULL, &func_name,
60 params); 62 return_value, 3, params);
63
64 func->handler = orig_handler;
65}
66
67PHP_FUNCTION(sp_in_array) {
68 array_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, "in_array",
69 sizeof("in_array") - 1, PHP_FN(sp_in_array));
70}
71
72PHP_FUNCTION(sp_array_search) {
73 array_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, "array_search",
74 sizeof("array_search") - 1, PHP_FN(sp_array_search));
75}
61 76
62 func->handler = PHP_FN(sp_in_array); 77PHP_FUNCTION(sp_array_keys) {
78 array_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, "array_keys",
79 sizeof("array_keys") - 1, PHP_FN(sp_array_keys));
63} 80}
64 81
65void hook_sloppy() { 82void hook_sloppy() {
@@ -76,4 +93,6 @@ void hook_sloppy() {
76 } 93 }
77 94
78 HOOK_FUNCTION("in_array", sp_internal_functions_hook, PHP_FN(sp_in_array)); 95 HOOK_FUNCTION("in_array", sp_internal_functions_hook, PHP_FN(sp_in_array));
96 HOOK_FUNCTION("array_search", sp_internal_functions_hook, PHP_FN(sp_array_search));
97 HOOK_FUNCTION("array_keys", sp_internal_functions_hook, PHP_FN(sp_array_keys));
79} 98}
diff --git a/src/tests/sloppy_comparison_array.phpt b/src/tests/sloppy_comparison_array.phpt
index c32586d..79f9ed6 100644
--- a/src/tests/sloppy_comparison_array.phpt
+++ b/src/tests/sloppy_comparison_array.phpt
@@ -1,5 +1,5 @@
1--TEST-- 1--TEST--
2Sloppy comparison 2Sloppy comparison in_array
3--SKIPIF-- 3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?> 4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?>
5--INI-- 5--INI--
diff --git a/src/tests/sloppy_comparison_array_disabled.phpt b/src/tests/sloppy_comparison_array_disabled.phpt
index 2053400..b98c06b 100644
--- a/src/tests/sloppy_comparison_array_disabled.phpt
+++ b/src/tests/sloppy_comparison_array_disabled.phpt
@@ -1,5 +1,5 @@
1--TEST-- 1--TEST--
2Sloppy comparison 2Sloppy comparison in_array disabled
3--SKIPIF-- 3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?> 4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?>
5--FILE-- 5--FILE--
diff --git a/src/tests/sloppy_comparison_array_keys.phpt b/src/tests/sloppy_comparison_array_keys.phpt
new file mode 100644
index 0000000..4adcbdb
--- /dev/null
+++ b/src/tests/sloppy_comparison_array_keys.phpt
@@ -0,0 +1,20 @@
1--TEST--
2Sloppy comparison array_keys
3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?>
5--INI--
6sp.configuration_file={PWD}/config/sloppy_comparison.ini
7--FILE--
8<?php
9$qwe = array(rand(1,2), "qwe");
10var_dump(array_keys($qwe, 0));
11var_dump(array_keys($qwe, 0, 0));
12var_dump(array_keys($qwe, 0, 1));
13?>
14--EXPECT--
15array(0) {
16}
17array(0) {
18}
19array(0) {
20}
diff --git a/src/tests/sloppy_comparison_array_keys_disabled.phpt b/src/tests/sloppy_comparison_array_keys_disabled.phpt
new file mode 100644
index 0000000..8e3c8fb
--- /dev/null
+++ b/src/tests/sloppy_comparison_array_keys_disabled.phpt
@@ -0,0 +1,22 @@
1--TEST--
2Sloppy comparison array_keys disabled
3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?>
5--FILE--
6<?php
7$qwe = array(rand(1,2), "qwe");
8var_dump(array_keys($qwe, 0));
9var_dump(array_keys($qwe, 0, 0));
10var_dump(array_keys($qwe, 0, 1));
11?>
12--EXPECT--
13array(1) {
14 [0]=>
15 int(1)
16}
17array(1) {
18 [0]=>
19 int(1)
20}
21array(0) {
22}
diff --git a/src/tests/sloppy_comparison_array_search.phpt b/src/tests/sloppy_comparison_array_search.phpt
new file mode 100644
index 0000000..60d11d1
--- /dev/null
+++ b/src/tests/sloppy_comparison_array_search.phpt
@@ -0,0 +1,17 @@
1--TEST--
2Sloppy comparison array_search
3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?>
5--INI--
6sp.configuration_file={PWD}/config/sloppy_comparison.ini
7--FILE--
8<?php
9$qwe = array(rand(1,2), "qwe");
10var_dump(array_search(0, $qwe));
11var_dump(array_search(0, $qwe, 0));
12var_dump(array_search(0, $qwe, 1));
13?>
14--EXPECT--
15bool(false)
16bool(false)
17bool(false)
diff --git a/src/tests/sloppy_comparison_array_search_disabled.phpt b/src/tests/sloppy_comparison_array_search_disabled.phpt
new file mode 100644
index 0000000..3a3a567
--- /dev/null
+++ b/src/tests/sloppy_comparison_array_search_disabled.phpt
@@ -0,0 +1,15 @@
1--TEST--
2Sloppy comparison array_search disabled
3--SKIPIF--
4<?php if (!extension_loaded("snuffleupagus")) print "skip"; ?>
5--FILE--
6<?php
7$qwe = array(rand(1,2), "qwe");
8var_dump(array_search(0, $qwe));
9var_dump(array_search(0, $qwe, 0));
10var_dump(array_search(0, $qwe, 1));
11?>
12--EXPECT--
13int(1)
14int(1)
15bool(false)