From 2950b59dad013a0c47e4d38d43db3de759c07cad Mon Sep 17 00:00:00 2001 From: xXx-caillou-xXx Date: Tue, 28 Aug 2018 15:21:07 +0200 Subject: Add array_search and array_keys hooks to kill sloppy comparisons --- src/sp_sloppy.c | 33 +++++++++++++++++----- src/tests/sloppy_comparison_array.phpt | 2 +- src/tests/sloppy_comparison_array_disabled.phpt | 2 +- src/tests/sloppy_comparison_array_keys.phpt | 20 +++++++++++++ .../sloppy_comparison_array_keys_disabled.phpt | 22 +++++++++++++++ src/tests/sloppy_comparison_array_search.phpt | 17 +++++++++++ .../sloppy_comparison_array_search_disabled.phpt | 15 ++++++++++ 7 files changed, 102 insertions(+), 9 deletions(-) create mode 100644 src/tests/sloppy_comparison_array_keys.phpt create mode 100644 src/tests/sloppy_comparison_array_keys_disabled.phpt create mode 100644 src/tests/sloppy_comparison_array_search.phpt create mode 100644 src/tests/sloppy_comparison_array_search_disabled.phpt 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, return opline; } -PHP_FUNCTION(sp_in_array) { +static void array_handler(INTERNAL_FUNCTION_PARAMETERS, + const char *name, size_t size, + void (*orig_handler)(INTERNAL_FUNCTION_PARAMETERS)) { void (*handler)(INTERNAL_FUNCTION_PARAMETERS); zval func_name; zval params[3] = {{{0}}}; @@ -48,18 +50,33 @@ PHP_FUNCTION(sp_in_array) { ZVAL_COPY(¶ms[0], value); ZVAL_COPY(¶ms[1], array); ZVAL_BOOL(¶ms[2], 1); - ZVAL_STRING(&func_name, "in_array"); + ZVAL_STRING(&func_name, name); handler = zend_hash_str_find_ptr( - SNUFFLEUPAGUS_G(sp_internal_functions_hook), "in_array", sizeof("in_array") - 1); + SNUFFLEUPAGUS_G(sp_internal_functions_hook), name, size); zend_internal_function *func = zend_hash_str_find_ptr( - CG(function_table), "in_array", sizeof("in_array") - 1); + CG(function_table), name, size); func->handler = handler; - call_user_function(CG(function_table), NULL, &func_name, return_value, 3, - params); + call_user_function(CG(function_table), NULL, &func_name, + return_value, 3, params); + + func->handler = orig_handler; +} + +PHP_FUNCTION(sp_in_array) { + array_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, "in_array", + sizeof("in_array") - 1, PHP_FN(sp_in_array)); +} + +PHP_FUNCTION(sp_array_search) { + array_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, "array_search", + sizeof("array_search") - 1, PHP_FN(sp_array_search)); +} - func->handler = PHP_FN(sp_in_array); +PHP_FUNCTION(sp_array_keys) { + array_handler(INTERNAL_FUNCTION_PARAM_PASSTHRU, "array_keys", + sizeof("array_keys") - 1, PHP_FN(sp_array_keys)); } void hook_sloppy() { @@ -76,4 +93,6 @@ void hook_sloppy() { } HOOK_FUNCTION("in_array", sp_internal_functions_hook, PHP_FN(sp_in_array)); + HOOK_FUNCTION("array_search", sp_internal_functions_hook, PHP_FN(sp_array_search)); + HOOK_FUNCTION("array_keys", sp_internal_functions_hook, PHP_FN(sp_array_keys)); } 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 @@ --TEST-- -Sloppy comparison +Sloppy comparison in_array --SKIPIF-- --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 @@ --TEST-- -Sloppy comparison +Sloppy comparison in_array disabled --SKIPIF-- --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 @@ +--TEST-- +Sloppy comparison array_keys +--SKIPIF-- + +--INI-- +sp.configuration_file={PWD}/config/sloppy_comparison.ini +--FILE-- + +--EXPECT-- +array(0) { +} +array(0) { +} +array(0) { +} 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 @@ +--TEST-- +Sloppy comparison array_keys disabled +--SKIPIF-- + +--FILE-- + +--EXPECT-- +array(1) { + [0]=> + int(1) +} +array(1) { + [0]=> + int(1) +} +array(0) { +} 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 @@ +--TEST-- +Sloppy comparison array_search +--SKIPIF-- + +--INI-- +sp.configuration_file={PWD}/config/sloppy_comparison.ini +--FILE-- + +--EXPECT-- +bool(false) +bool(false) +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 @@ +--TEST-- +Sloppy comparison array_search disabled +--SKIPIF-- + +--FILE-- + +--EXPECT-- +int(1) +int(1) +bool(false) -- cgit v1.3