]> granicus.if.org Git - php/commitdiff
Use ZPP callable check for ldap_set_rebind_proc()
authorGeorge Peter Banyard <girgias@php.net>
Wed, 8 Jul 2020 16:44:34 +0000 (18:44 +0200)
committerGeorge Peter Banyard <girgias@php.net>
Thu, 13 Aug 2020 19:14:51 +0000 (21:14 +0200)
ext/ldap/ldap.c
ext/ldap/tests/ldap_set_rebind_proc_error.phpt

index cb0ab4f02c93de5aaa1512e33543e4fb7c76135f..c095749b6c8f8dde6992f80c580cc4403d48403d 100644 (file)
@@ -3710,10 +3710,12 @@ int _ldap_rebind_proc(LDAP *ldap, const char *url, ber_tag_t req, ber_int_t msgi
 /* {{{ Set a callback function to do re-binds on referral chasing. */
 PHP_FUNCTION(ldap_set_rebind_proc)
 {
-       zval *link, *callback;
+       zval *link;
+       zend_fcall_info fci;
+       zend_fcall_info_cache fcc;
        ldap_linkdata *ld;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz", &link, &callback) != SUCCESS) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS(), "rf!", &link, &fci, &fcc) == FAILURE) {
                RETURN_THROWS();
        }
 
@@ -3721,7 +3723,7 @@ PHP_FUNCTION(ldap_set_rebind_proc)
                RETURN_THROWS();
        }
 
-       if (Z_TYPE_P(callback) == IS_NULL) {
+       if (!ZEND_FCI_INITIALIZED(fci)) {
                /* unregister rebind procedure */
                if (!Z_ISUNDEF(ld->rebindproc)) {
                        zval_ptr_dtor(&ld->rebindproc);
@@ -3731,12 +3733,6 @@ PHP_FUNCTION(ldap_set_rebind_proc)
                RETURN_TRUE;
        }
 
-       /* callable? */
-       if (!zend_is_callable(callback, 0, NULL)) {
-               zend_argument_type_error(2, "must be a valid callback or null, %s given", zend_zval_type_name(callback));
-               RETURN_THROWS();
-       }
-
        /* register rebind procedure */
        if (Z_ISUNDEF(ld->rebindproc)) {
                ldap_set_rebind_proc(ld->link, _ldap_rebind_proc, (void *) link);
@@ -3744,7 +3740,7 @@ PHP_FUNCTION(ldap_set_rebind_proc)
                zval_ptr_dtor(&ld->rebindproc);
        }
 
-       ZVAL_COPY(&ld->rebindproc, callback);
+       ZVAL_COPY(&ld->rebindproc, &fci.function_name);
        RETURN_TRUE;
 }
 /* }}} */
index c12989b15f207ea98ee9fbeb9c06fd352b49ed24..9027a4628f5e649548fa138cd43494767cd6954b 100644 (file)
@@ -39,5 +39,5 @@ try {
     echo $error->getMessage(), "\n";
 }
 ?>
---EXPECTF--
-ldap_set_rebind_proc(): Argument #2 ($callback) must be a valid callback or null, string given
+--EXPECT--
+ldap_set_rebind_proc(): Argument #2 ($callback) must be a valid callback or null, function "rebind_proc_inexistent" not found or invalid function name