From c3fc65eb7c3946c737ba9c323ca29d5fd6164449 Mon Sep 17 00:00:00 2001 From: Tyson Andre Date: Tue, 8 Sep 2015 15:24:09 -0700 Subject: [PATCH 1/2] Fix bug in LDAP extensions' saving TIMELIMIT and DEREF LDAP_OPT_TIMELIMIT and LDAP_OPT_DEREF's original values weren't saved properly because of a bug introduced when copy and pasting. This lead to the original timeout being changed when specifying a temporary override (e.g. for ldap_search(..., $timeout)) --- ext/ldap/ldap.c | 4 +- ext/ldap/tests/ldap_search_overrides.phpt | 215 ++++++++++++++++++++++ 2 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 ext/ldap/tests/ldap_search_overrides.phpt diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 4db15e5bb92..b3b888405a0 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -600,7 +600,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in /* timelimit */ if (timelimit > -1) { #if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP - ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_timelimit); + ldap_get_option(ldap, LDAP_OPT_TIMELIMIT, old_timelimit); ldap_set_option(ldap, LDAP_OPT_TIMELIMIT, &timelimit); #else *old_timelimit = ldap->ld_timelimit; @@ -611,7 +611,7 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in /* deref */ if (deref > -1) { #if (LDAP_API_VERSION >= 2004) || HAVE_NSLDAP || HAVE_ORALDAP - ldap_get_option(ldap, LDAP_OPT_SIZELIMIT, old_deref); + ldap_get_option(ldap, LDAP_OPT_DEREF, old_deref); ldap_set_option(ldap, LDAP_OPT_DEREF, &deref); #else *old_deref = ldap->ld_deref; diff --git a/ext/ldap/tests/ldap_search_overrides.phpt b/ext/ldap/tests/ldap_search_overrides.phpt new file mode 100644 index 00000000000..72d8e2498e5 --- /dev/null +++ b/ext/ldap/tests/ldap_search_overrides.phpt @@ -0,0 +1,215 @@ +--TEST-- +ldap_search() test - test that overrides aren't permanent +--CREDITS-- +Tyson Andre +# Based on ldap_search_basic.phpt +--SKIPIF-- + +--FILE-- + +===DONE=== +--CLEAN-- + +--EXPECTF-- +resource(%d) of type (ldap result) +array(4) { + ["count"]=> + int(3) + [0]=> + array(14) { + ["objectclass"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(6) "person" + } + [0]=> + string(11) "objectclass" + ["cn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(5) "userA" + } + [1]=> + string(2) "cn" + ["sn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(7) "testSN1" + } + [2]=> + string(2) "sn" + ["userpassword"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(4) "oops" + } + [3]=> + string(12) "userpassword" + ["telephonenumber"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(14) "xx-xx-xx-xx-xx" + } + [4]=> + string(15) "telephonenumber" + ["description"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(6) "user A" + } + [5]=> + string(11) "description" + ["count"]=> + int(6) + ["dn"]=> + string(%d) "cn=userA,%s" + } + [1]=> + array(12) { + ["objectclass"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(6) "person" + } + [0]=> + string(11) "objectclass" + ["cn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(5) "userB" + } + [1]=> + string(2) "cn" + ["sn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(7) "testSN2" + } + [2]=> + string(2) "sn" + ["userpassword"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(15) "oopsIDitItAgain" + } + [3]=> + string(12) "userpassword" + ["description"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(6) "user B" + } + [4]=> + string(11) "description" + ["count"]=> + int(5) + ["dn"]=> + string(%d) "cn=userB,%s" + } + [2]=> + array(10) { + ["objectclass"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(6) "person" + } + [0]=> + string(11) "objectclass" + ["cn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(5) "userC" + } + [1]=> + string(2) "cn" + ["sn"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(7) "testSN3" + } + [2]=> + string(2) "sn" + ["userpassword"]=> + array(2) { + ["count"]=> + int(1) + [0]=> + string(17) "0r1g1na1 passw0rd" + } + [3]=> + string(12) "userpassword" + ["count"]=> + int(4) + ["dn"]=> + string(%d) "cn=userC,cn=userB,%s" + } +} +bool(true) +int(1) +bool(true) +int(123) +bool(true) +int(33) +bool(true) +int(44) +===DONE=== From b1be126788162052707f5553ae1cafca0faa06ce Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Wed, 9 Sep 2015 11:54:44 +0300 Subject: [PATCH 2/2] Avoid useless EG(exception) checks --- Zend/zend_vm_def.h | 14 ++++++++------ Zend/zend_vm_execute.h | 14 ++++++++------ 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 799a66e5ebc..193ea32c623 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6102,10 +6102,11 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH_R, VAR, ANY) } } else { zend_error(E_WARNING, "Invalid argument supplied for foreach()"); -ZEND_VM_C_LABEL(fe_fetch_r_exit): - if (EXPECTED(!EG(exception))) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + if (UNEXPECTED(EG(exception))) { + HANDLE_EXCEPTION(); } +ZEND_VM_C_LABEL(fe_fetch_r_exit): + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); } @@ -6293,10 +6294,11 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY) } } else { zend_error(E_WARNING, "Invalid argument supplied for foreach()"); -ZEND_VM_C_LABEL(fe_fetch_w_exit): - if (EXPECTED(!EG(exception))) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + if (UNEXPECTED(EG(exception))) { + HANDLE_EXCEPTION(); } +ZEND_VM_C_LABEL(fe_fetch_w_exit): + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a9cb1e6207f..2889de55f25 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -15912,10 +15912,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE } } else { zend_error(E_WARNING, "Invalid argument supplied for foreach()"); -fe_fetch_r_exit: - if (EXPECTED(!EG(exception))) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + if (UNEXPECTED(EG(exception))) { + HANDLE_EXCEPTION(); } +fe_fetch_r_exit: + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); } @@ -16103,10 +16104,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z } } else { zend_error(E_WARNING, "Invalid argument supplied for foreach()"); -fe_fetch_w_exit: - if (EXPECTED(!EG(exception))) { - ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); + if (UNEXPECTED(EG(exception))) { + HANDLE_EXCEPTION(); } +fe_fetch_w_exit: + ZEND_VM_SET_RELATIVE_OPCODE(opline, opline->extended_value); ZEND_VM_CONTINUE(); }