From e6219a095de78ce03be4a36360020a6f4fe94105 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sun, 21 Aug 2022 15:58:09 +0200 Subject: Fix sloppy comparison --- src/snuffleupagus.c | 2 +- src/sp_execute.c | 8 ++++++-- src/sp_sloppy.c | 21 +++++++++++---------- src/tests/global_strict/global_strict_issue432.phpt | 21 +++++++++++++++++++++ src/tests/sloppy_comparison/sloppy_comparison.phpt | 2 +- .../sloppy_comparison/sloppy_comparison_array.phpt | 2 +- .../sloppy_comparison_array_keys.phpt | 4 ++-- .../sloppy_comparison_array_search.phpt | 4 ++-- .../sloppy_comparison_disable.phpt | 19 +++++++++++++++++-- 9 files changed, 62 insertions(+), 21 deletions(-) create mode 100644 src/tests/global_strict/global_strict_issue432.phpt (limited to 'src') diff --git a/src/snuffleupagus.c b/src/snuffleupagus.c index 30f6b3d..be6240e 100644 --- a/src/snuffleupagus.c +++ b/src/snuffleupagus.c @@ -21,7 +21,7 @@ ZEND_DLEXPORT int sp_zend_startup(zend_extension *extension) { static inline void sp_op_array_handler(zend_op_array *const op) { // We need a filename, and strict mode not already enabled on this op - if (NULL == op->filename || op->fn_flags & ZEND_ACC_STRICT_TYPES) { + if (NULL == op->filename) { return; } else { if (SPCFG(global_strict).enable) { diff --git a/src/sp_execute.c b/src/sp_execute.c index b4e5c6c..5c0c939 100644 --- a/src/sp_execute.c +++ b/src/sp_execute.c @@ -353,14 +353,18 @@ ZEND_API zend_op_array* sp_compile_string(zval* source_string, char* filename) { // TODO(jvoisin) handle recursive calls to `eval` SPG(eval_source_string) = source_string; zend_op_array* opline = orig_zend_compile_string(source_string, filename); - sp_sloppy_modify_opcode(opline); + if (SPCFG(sloppy).enable) { + sp_sloppy_modify_opcode(opline); + } return opline; } ZEND_API zend_op_array* sp_compile_file(zend_file_handle* file_handle, int type) { zend_op_array* opline = orig_zend_compile_file(file_handle, type); - sp_sloppy_modify_opcode(opline); + if (SPCFG(sloppy).enable) { + sp_sloppy_modify_opcode(opline); + } return opline; } diff --git a/src/sp_sloppy.c b/src/sp_sloppy.c index 2c6ef6a..4c97d0e 100644 --- a/src/sp_sloppy.c +++ b/src/sp_sloppy.c @@ -1,16 +1,17 @@ #include "php_snuffleupagus.h" void sp_sloppy_modify_opcode(zend_op_array* opline) { - if (NULL != opline) { - for (size_t i = 0; i < opline->last; i++) { - zend_op* orig_opline = &(opline->opcodes[i]); - if (orig_opline->opcode == ZEND_IS_EQUAL) { - orig_opline->opcode = ZEND_IS_IDENTICAL; - zend_vm_set_opcode_handler(orig_opline); - } else if (orig_opline->opcode == ZEND_IS_NOT_EQUAL) { - orig_opline->opcode = ZEND_IS_NOT_IDENTICAL; - zend_vm_set_opcode_handler(orig_opline); - } + if (NULL == opline) { + return; + } + for (size_t i = 0; i < opline->last; i++) { + zend_op* orig_opline = &(opline->opcodes[i]); + if (orig_opline->opcode == ZEND_IS_EQUAL) { + orig_opline->opcode = ZEND_IS_IDENTICAL; + zend_vm_set_opcode_handler(orig_opline); + } else if (orig_opline->opcode == ZEND_IS_NOT_EQUAL) { + orig_opline->opcode = ZEND_IS_NOT_IDENTICAL; + zend_vm_set_opcode_handler(orig_opline); } } } diff --git a/src/tests/global_strict/global_strict_issue432.phpt b/src/tests/global_strict/global_strict_issue432.phpt new file mode 100644 index 0000000..008529e --- /dev/null +++ b/src/tests/global_strict/global_strict_issue432.phpt @@ -0,0 +1,21 @@ +--TEST-- +Global strict mode, for issue #432 +--SKIPIF-- + +--INI-- +sp.configuration_file={PWD}/config/global_strict_disabled.ini +--FILE-- + +--EXPECT-- +WINWIN diff --git a/src/tests/sloppy_comparison/sloppy_comparison.phpt b/src/tests/sloppy_comparison/sloppy_comparison.phpt index da28e3d..cf91f15 100644 --- a/src/tests/sloppy_comparison/sloppy_comparison.phpt +++ b/src/tests/sloppy_comparison/sloppy_comparison.phpt @@ -12,7 +12,7 @@ if ($qwe == 0) { } $qwe = "0e123"; if ("0e432" == $qwe) { - echo "failed"; + echo "failed_power"; } $qwe = []; $test = false; diff --git a/src/tests/sloppy_comparison/sloppy_comparison_array.phpt b/src/tests/sloppy_comparison/sloppy_comparison_array.phpt index 79f9ed6..1316663 100644 --- a/src/tests/sloppy_comparison/sloppy_comparison_array.phpt +++ b/src/tests/sloppy_comparison/sloppy_comparison_array.phpt @@ -8,7 +8,7 @@ sp.configuration_file={PWD}/config/sloppy_comparison.ini --EXPECT-- bool(false) diff --git a/src/tests/sloppy_comparison/sloppy_comparison_array_keys.phpt b/src/tests/sloppy_comparison/sloppy_comparison_array_keys.phpt index 934f3ba..25e89e8 100644 --- a/src/tests/sloppy_comparison/sloppy_comparison_array_keys.phpt +++ b/src/tests/sloppy_comparison/sloppy_comparison_array_keys.phpt @@ -8,8 +8,8 @@ sp.configuration_file={PWD}/config/sloppy_comparison.ini 1, diff --git a/src/tests/sloppy_comparison/sloppy_comparison_array_search.phpt b/src/tests/sloppy_comparison/sloppy_comparison_array_search.phpt index 60d11d1..ac3f10f 100644 --- a/src/tests/sloppy_comparison/sloppy_comparison_array_search.phpt +++ b/src/tests/sloppy_comparison/sloppy_comparison_array_search.phpt @@ -8,8 +8,8 @@ sp.configuration_file={PWD}/config/sloppy_comparison.ini --EXPECT-- bool(false) diff --git a/src/tests/sloppy_comparison/sloppy_comparison_disable.phpt b/src/tests/sloppy_comparison/sloppy_comparison_disable.phpt index cdcd9a8..be615f5 100644 --- a/src/tests/sloppy_comparison/sloppy_comparison_disable.phpt +++ b/src/tests/sloppy_comparison/sloppy_comparison_disable.phpt @@ -9,8 +9,23 @@ sp.allow_broken_configuration=On --EXPECT-- -OK +ONETWOTHREEFOUR -- cgit v1.3