diff options
| author | xXx-caillou-xXx | 2018-08-28 15:21:07 +0200 |
|---|---|---|
| committer | jvoisin | 2018-08-28 13:21:07 +0000 |
| commit | 2950b59dad013a0c47e4d38d43db3de759c07cad (patch) | |
| tree | 4c9d38299f9fdc93ad69d088e05552088b4ed36a /src | |
| parent | 3e6790044e2c2652f190d528b4403fbb3fa6e565 (diff) | |
Add array_search and array_keys hooks to kill sloppy comparisons
Diffstat (limited to 'src')
| -rw-r--r-- | src/sp_sloppy.c | 33 | ||||
| -rw-r--r-- | src/tests/sloppy_comparison_array.phpt | 2 | ||||
| -rw-r--r-- | src/tests/sloppy_comparison_array_disabled.phpt | 2 | ||||
| -rw-r--r-- | src/tests/sloppy_comparison_array_keys.phpt | 20 | ||||
| -rw-r--r-- | src/tests/sloppy_comparison_array_keys_disabled.phpt | 22 | ||||
| -rw-r--r-- | src/tests/sloppy_comparison_array_search.phpt | 17 | ||||
| -rw-r--r-- | src/tests/sloppy_comparison_array_search_disabled.phpt | 15 |
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 | ||
| 39 | PHP_FUNCTION(sp_in_array) { | 39 | static 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(¶ms[0], value); | 50 | ZVAL_COPY(¶ms[0], value); |
| 49 | ZVAL_COPY(¶ms[1], array); | 51 | ZVAL_COPY(¶ms[1], array); |
| 50 | ZVAL_BOOL(¶ms[2], 1); | 52 | ZVAL_BOOL(¶ms[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 | |||
| 67 | PHP_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 | |||
| 72 | PHP_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); | 77 | PHP_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 | ||
| 65 | void hook_sloppy() { | 82 | void 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-- |
| 2 | Sloppy comparison | 2 | Sloppy 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-- |
| 2 | Sloppy comparison | 2 | Sloppy 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-- | ||
| 2 | Sloppy comparison array_keys | ||
| 3 | --SKIPIF-- | ||
| 4 | <?php if (!extension_loaded("snuffleupagus")) print "skip"; ?> | ||
| 5 | --INI-- | ||
| 6 | sp.configuration_file={PWD}/config/sloppy_comparison.ini | ||
| 7 | --FILE-- | ||
| 8 | <?php | ||
| 9 | $qwe = array(rand(1,2), "qwe"); | ||
| 10 | var_dump(array_keys($qwe, 0)); | ||
| 11 | var_dump(array_keys($qwe, 0, 0)); | ||
| 12 | var_dump(array_keys($qwe, 0, 1)); | ||
| 13 | ?> | ||
| 14 | --EXPECT-- | ||
| 15 | array(0) { | ||
| 16 | } | ||
| 17 | array(0) { | ||
| 18 | } | ||
| 19 | array(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-- | ||
| 2 | Sloppy 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"); | ||
| 8 | var_dump(array_keys($qwe, 0)); | ||
| 9 | var_dump(array_keys($qwe, 0, 0)); | ||
| 10 | var_dump(array_keys($qwe, 0, 1)); | ||
| 11 | ?> | ||
| 12 | --EXPECT-- | ||
| 13 | array(1) { | ||
| 14 | [0]=> | ||
| 15 | int(1) | ||
| 16 | } | ||
| 17 | array(1) { | ||
| 18 | [0]=> | ||
| 19 | int(1) | ||
| 20 | } | ||
| 21 | array(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-- | ||
| 2 | Sloppy comparison array_search | ||
| 3 | --SKIPIF-- | ||
| 4 | <?php if (!extension_loaded("snuffleupagus")) print "skip"; ?> | ||
| 5 | --INI-- | ||
| 6 | sp.configuration_file={PWD}/config/sloppy_comparison.ini | ||
| 7 | --FILE-- | ||
| 8 | <?php | ||
| 9 | $qwe = array(rand(1,2), "qwe"); | ||
| 10 | var_dump(array_search(0, $qwe)); | ||
| 11 | var_dump(array_search(0, $qwe, 0)); | ||
| 12 | var_dump(array_search(0, $qwe, 1)); | ||
| 13 | ?> | ||
| 14 | --EXPECT-- | ||
| 15 | bool(false) | ||
| 16 | bool(false) | ||
| 17 | bool(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-- | ||
| 2 | Sloppy 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"); | ||
| 8 | var_dump(array_search(0, $qwe)); | ||
| 9 | var_dump(array_search(0, $qwe, 0)); | ||
| 10 | var_dump(array_search(0, $qwe, 1)); | ||
| 11 | ?> | ||
| 12 | --EXPECT-- | ||
| 13 | int(1) | ||
| 14 | int(1) | ||
| 15 | bool(false) | ||
