@@ -745,18 +745,17 @@ static void _php_ldap_controls_to_array(LDAP *ld, LDAPControl** ctrls, zval* arr
745745 ldap_controls_free (ctrls );
746746}
747747
748- static LDAPControl * * _php_ldap_controls_from_array (LDAP * ld , zval * array , uint32_t arg_num )
748+ static LDAPControl * * php_ldap_controls_from_array (LDAP * ld , const HashTable * controls , uint32_t arg_num )
749749{
750- int ncontrols ;
751750 LDAPControl * * ctrlp , * * ctrls = NULL ;
752751 zval * ctrlarray ;
753752 int error = 0 ;
754753
755- ncontrols = zend_hash_num_elements (Z_ARRVAL_P ( array ) );
756- ctrls = safe_emalloc ((1 + ncontrols ), sizeof (* ctrls ), 0 );
754+ uint32_t num_controls = zend_hash_num_elements (controls );
755+ ctrls = safe_emalloc ((1 + num_controls ), sizeof (* ctrls ), 0 );
757756 * ctrls = NULL ;
758757 ctrlp = ctrls ;
759- ZEND_HASH_FOREACH_VAL (Z_ARRVAL_P ( array ) , ctrlarray ) {
758+ ZEND_HASH_FOREACH_VAL (controls , ctrlarray ) {
760759 if (Z_TYPE_P (ctrlarray ) != IS_ARRAY ) {
761760 zend_argument_type_error (arg_num , "must contain only arrays, where each array is a control" );
762761 error = 1 ;
@@ -1145,25 +1144,25 @@ PHP_FUNCTION(ldap_bind)
11451144/* {{{ Bind to LDAP directory */
11461145PHP_FUNCTION (ldap_bind_ext )
11471146{
1148- zval * serverctrls = NULL ;
11491147 zval * link ;
11501148 char * ldap_bind_dn = NULL , * ldap_bind_pw = NULL ;
11511149 size_t ldap_bind_dnlen , ldap_bind_pwlen ;
1150+ HashTable * server_controls_ht = NULL ;
11521151 ldap_linkdata * ld ;
11531152 LDAPControl * * lserverctrls = NULL ;
11541153 ldap_resultdata * result ;
11551154 LDAPMessage * ldap_res ;
11561155 int rc ;
11571156
1158- if (zend_parse_parameters (ZEND_NUM_ARGS (), "O|p!p!a !" , & link , ldap_link_ce , & ldap_bind_dn , & ldap_bind_dnlen , & ldap_bind_pw , & ldap_bind_pwlen , & serverctrls ) != SUCCESS ) {
1157+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "O|p!p!h !" , & link , ldap_link_ce , & ldap_bind_dn , & ldap_bind_dnlen , & ldap_bind_pw , & ldap_bind_pwlen , & server_controls_ht ) != SUCCESS ) {
11591158 RETURN_THROWS ();
11601159 }
11611160
11621161 ld = Z_LDAP_LINK_P (link );
11631162 VERIFY_LDAP_LINK_CONNECTED (ld );
11641163
1165- if (serverctrls ) {
1166- lserverctrls = _php_ldap_controls_from_array (ld -> link , serverctrls , 4 );
1164+ if (server_controls_ht ) {
1165+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 4 );
11671166 if (lserverctrls == NULL ) {
11681167 RETVAL_FALSE ;
11691168 goto cleanup ;
@@ -1402,12 +1401,13 @@ static void php_set_opts(LDAP *ldap, int sizelimit, int timelimit, int deref, in
14021401/* {{{ php_ldap_do_search */
14031402static void php_ldap_do_search (INTERNAL_FUNCTION_PARAMETERS , int scope )
14041403{
1405- zval * link , * attrs = NULL , * serverctrls = NULL ;
1404+ zval * link , * attrs = NULL ;
14061405 HashTable * base_dn_ht = NULL ;
14071406 zend_string * base_dn_str = NULL ;
14081407 HashTable * filter_ht = NULL ;
14091408 zend_string * filter_str = NULL ;
14101409 zend_long attrsonly , sizelimit , timelimit , deref ;
1410+ HashTable * server_controls_ht = NULL ;
14111411 char * * ldap_attrs = NULL ;
14121412 ldap_linkdata * ld = NULL ;
14131413 ldap_resultdata * result ;
@@ -1427,7 +1427,7 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
14271427 Z_PARAM_LONG (sizelimit )
14281428 Z_PARAM_LONG (timelimit )
14291429 Z_PARAM_LONG (deref )
1430- Z_PARAM_ARRAY_EX ( serverctrls , 1 , 1 )
1430+ Z_PARAM_ARRAY_HT_EX ( server_controls_ht , 1 , 1 )
14311431 ZEND_PARSE_PARAMETERS_END ();
14321432
14331433 /* Reverse -> fall through */
@@ -1600,10 +1600,10 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
16001600 }
16011601 }
16021602
1603- if (serverctrls ) {
1603+ if (server_controls_ht ) {
16041604 /* We have to parse controls again for each link as they use it */
16051605 _php_ldap_controls_free (& lserverctrls );
1606- lserverctrls = _php_ldap_controls_from_array (current_ld -> link , serverctrls , 9 );
1606+ lserverctrls = php_ldap_controls_from_array (current_ld -> link , server_controls_ht , 9 );
16071607 if (lserverctrls == NULL ) {
16081608 rcs [ldap_link_index ] = -1 ;
16091609 // TODO Throw an exception/cleanup?
@@ -1661,8 +1661,8 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
16611661 goto cleanup ;
16621662 }
16631663
1664- if (serverctrls ) {
1665- lserverctrls = _php_ldap_controls_from_array (ld -> link , serverctrls , 9 );
1664+ if (server_controls_ht ) {
1665+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 9 );
16661666 if (lserverctrls == NULL ) {
16671667 ret = 0 ;
16681668 goto cleanup ;
@@ -2193,19 +2193,19 @@ PHP_FUNCTION(ldap_dn2ufn)
21932193/* {{{ php_ldap_do_modify */
21942194static void php_ldap_do_modify (INTERNAL_FUNCTION_PARAMETERS , int oper , int ext )
21952195{
2196- zval * serverctrls = NULL ;
21972196 zval * link ;
21982197 ldap_linkdata * ld ;
21992198 char * dn ;
22002199 HashTable * attributes_ht ;
2200+ HashTable * server_controls_ht = NULL ;
22012201 LDAPMod * * ldap_mods ;
22022202 LDAPControl * * lserverctrls = NULL ;
22032203 ldap_resultdata * result ;
22042204 LDAPMessage * ldap_res ;
22052205 size_t dn_len ;
22062206 int is_full_add = 0 ; /* flag for full add operation so ldap_mod_add can be put back into oper, gerrit THomson */
22072207
2208- if (zend_parse_parameters (ZEND_NUM_ARGS (), "Oph/|a !" , & link , ldap_link_ce , & dn , & dn_len , & attributes_ht , & serverctrls ) != SUCCESS ) {
2208+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Oph/|h !" , & link , ldap_link_ce , & dn , & dn_len , & attributes_ht , & server_controls_ht ) != SUCCESS ) {
22092209 RETURN_THROWS ();
22102210 }
22112211
@@ -2305,8 +2305,8 @@ static void php_ldap_do_modify(INTERNAL_FUNCTION_PARAMETERS, int oper, int ext)
23052305 } ZEND_HASH_FOREACH_END ();
23062306 ldap_mods [num_attribs ] = NULL ;
23072307
2308- if (serverctrls ) {
2309- lserverctrls = _php_ldap_controls_from_array (ld -> link , serverctrls , 4 );
2308+ if (server_controls_ht ) {
2309+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 4 );
23102310 if (lserverctrls == NULL ) {
23112311 RETVAL_FALSE ;
23122312 goto cleanup ;
@@ -2446,8 +2446,8 @@ PHP_FUNCTION(ldap_mod_del_ext)
24462446/* {{{ php_ldap_do_delete */
24472447static void php_ldap_do_delete (INTERNAL_FUNCTION_PARAMETERS , int ext )
24482448{
2449- zval * serverctrls = NULL ;
24502449 zval * link ;
2450+ HashTable * server_controls_ht = NULL ;
24512451 ldap_linkdata * ld ;
24522452 LDAPControl * * lserverctrls = NULL ;
24532453 ldap_resultdata * result ;
@@ -2456,15 +2456,15 @@ static void php_ldap_do_delete(INTERNAL_FUNCTION_PARAMETERS, int ext)
24562456 int rc , msgid ;
24572457 size_t dn_len ;
24582458
2459- if (zend_parse_parameters (ZEND_NUM_ARGS (), "Op|a !" , & link , ldap_link_ce , & dn , & dn_len , & serverctrls ) != SUCCESS ) {
2459+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Op|h !" , & link , ldap_link_ce , & dn , & dn_len , & server_controls_ht ) != SUCCESS ) {
24602460 RETURN_THROWS ();
24612461 }
24622462
24632463 ld = Z_LDAP_LINK_P (link );
24642464 VERIFY_LDAP_LINK_CONNECTED (ld );
24652465
2466- if (serverctrls ) {
2467- lserverctrls = _php_ldap_controls_from_array (ld -> link , serverctrls , 3 );
2466+ if (server_controls_ht ) {
2467+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 3 );
24682468 if (lserverctrls == NULL ) {
24692469 RETVAL_FALSE ;
24702470 goto cleanup ;
@@ -2522,11 +2522,11 @@ PHP_FUNCTION(ldap_delete_ext)
25222522/* {{{ Perform multiple modifications as part of one operation */
25232523PHP_FUNCTION (ldap_modify_batch )
25242524{
2525- zval * server_controls_zv = NULL ;
25262525 zval * link ;
25272526 char * dn ;
25282527 size_t dn_len ;
25292528 HashTable * modifications ;
2529+ HashTable * server_controls_ht = NULL ;
25302530 LDAPControl * * lserverctrls = NULL ;
25312531
25322532 /*
@@ -2553,7 +2553,7 @@ PHP_FUNCTION(ldap_modify_batch)
25532553 ];
25542554 */
25552555
2556- if (zend_parse_parameters (ZEND_NUM_ARGS (), "Oph/|a !" , & link , ldap_link_ce , & dn , & dn_len , & modifications , & server_controls_zv ) != SUCCESS ) {
2556+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Oph/|h !" , & link , ldap_link_ce , & dn , & dn_len , & modifications , & server_controls_ht ) != SUCCESS ) {
25572557 RETURN_THROWS ();
25582558 }
25592559
@@ -2669,8 +2669,8 @@ PHP_FUNCTION(ldap_modify_batch)
26692669 /* validation of modifications array was successful */
26702670
26712671 /* Check that the LDAP server controls array is valid */
2672- if (server_controls_zv ) {
2673- lserverctrls = _php_ldap_controls_from_array (ld -> link , server_controls_zv , 4 );
2672+ if (server_controls_ht ) {
2673+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 4 );
26742674 if (lserverctrls == NULL ) {
26752675 _php_ldap_controls_free (& lserverctrls );
26762676 RETURN_FALSE ;
@@ -2846,30 +2846,30 @@ PHP_FUNCTION(ldap_error)
28462846/* {{{ Determine if an entry has a specific value for one of its attributes */
28472847PHP_FUNCTION (ldap_compare )
28482848{
2849- zval * serverctrls = NULL ;
28502849 zval * link ;
28512850 char * dn , * attr ;
28522851 size_t dn_len , attr_len ;
2852+ HashTable * server_controls_ht = NULL ;
28532853 ldap_linkdata * ld ;
28542854 LDAPControl * * lserverctrls = NULL ;
28552855 int ldap_errno ;
28562856 struct berval lvalue ;
28572857
2858- if (zend_parse_parameters (ZEND_NUM_ARGS (), "Opps|a !" ,
2858+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Opps|h !" ,
28592859 & link , ldap_link_ce ,
28602860 & dn , & dn_len ,
28612861 & attr , & attr_len ,
28622862 & lvalue .bv_val , & lvalue .bv_len ,
2863- & serverctrls
2863+ & server_controls_ht
28642864 ) != SUCCESS ) {
28652865 RETURN_THROWS ();
28662866 }
28672867
28682868 ld = Z_LDAP_LINK_P (link );
28692869 VERIFY_LDAP_LINK_CONNECTED (ld );
28702870
2871- if (serverctrls ) {
2872- lserverctrls = _php_ldap_controls_from_array (ld -> link , serverctrls , 5 );
2871+ if (server_controls_ht ) {
2872+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 5 );
28732873 if (lserverctrls == NULL ) {
28742874 RETVAL_FALSE ;
28752875 goto cleanup ;
@@ -3251,7 +3251,7 @@ PHP_FUNCTION(ldap_set_option)
32513251 RETURN_THROWS ();
32523252 }
32533253
3254- ctrls = _php_ldap_controls_from_array (ldap , newval , 3 );
3254+ ctrls = php_ldap_controls_from_array (ldap , Z_ARRVAL_P ( newval ) , 3 );
32553255
32563256 if (ctrls == NULL ) {
32573257 RETURN_FALSE ;
@@ -3526,7 +3526,6 @@ PHP_FUNCTION(ldap_parse_reference)
35263526/* {{{ php_ldap_do_rename */
35273527static void php_ldap_do_rename (INTERNAL_FUNCTION_PARAMETERS , int ext )
35283528{
3529- zval * serverctrls = NULL ;
35303529 zval * link ;
35313530 ldap_linkdata * ld ;
35323531 LDAPControl * * lserverctrls = NULL ;
@@ -3536,8 +3535,9 @@ static void php_ldap_do_rename(INTERNAL_FUNCTION_PARAMETERS, int ext)
35363535 char * dn , * newrdn , * newparent ;
35373536 size_t dn_len , newrdn_len , newparent_len ;
35383537 bool deleteoldrdn ;
3538+ HashTable * server_controls_ht = NULL ;
35393539
3540- if (zend_parse_parameters (ZEND_NUM_ARGS (), "Opppb|a !" , & link , ldap_link_ce , & dn , & dn_len , & newrdn , & newrdn_len , & newparent , & newparent_len , & deleteoldrdn , & serverctrls ) != SUCCESS ) {
3540+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "Opppb|h !" , & link , ldap_link_ce , & dn , & dn_len , & newrdn , & newrdn_len , & newparent , & newparent_len , & deleteoldrdn , & server_controls_ht ) != SUCCESS ) {
35413541 RETURN_THROWS ();
35423542 }
35433543
@@ -3549,8 +3549,8 @@ static void php_ldap_do_rename(INTERNAL_FUNCTION_PARAMETERS, int ext)
35493549 }
35503550
35513551#if (LDAP_API_VERSION > 2000 ) || defined(HAVE_ORALDAP )
3552- if (serverctrls ) {
3553- lserverctrls = _php_ldap_controls_from_array (ld -> link , serverctrls , 6 );
3552+ if (server_controls_ht ) {
3553+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 6 );
35543554 if (lserverctrls == NULL ) {
35553555 RETVAL_FALSE ;
35563556 goto cleanup ;
@@ -3857,10 +3857,10 @@ PHP_FUNCTION(ldap_8859_to_t61)
38573857/* {{{ Extended operations, Pierangelo Masarati */
38583858#ifdef HAVE_LDAP_EXTENDED_OPERATION_S
38593859static void php_ldap_exop (INTERNAL_FUNCTION_PARAMETERS , bool force_sync ) {
3860- zval * serverctrls = NULL ;
38613860 zval * link , * retdata = NULL , * retoid = NULL ;
38623861 char * lretoid = NULL ;
38633862 zend_string * reqoid , * reqdata = NULL ;
3863+ HashTable * server_controls_ht = NULL ;
38643864 struct berval lreqdata , * lretdata = NULL ;
38653865 ldap_linkdata * ld ;
38663866 ldap_resultdata * result ;
@@ -3875,7 +3875,7 @@ static void php_ldap_exop(INTERNAL_FUNCTION_PARAMETERS, bool force_sync) {
38753875 }
38763876 }
38773877
3878- if (zend_parse_parameters (ZEND_NUM_ARGS (), "OP|S!a !zz" , & link , ldap_link_ce , & reqoid , & reqdata , & serverctrls , & retdata , & retoid ) != SUCCESS ) {
3878+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "OP|S!h !zz" , & link , ldap_link_ce , & reqoid , & reqdata , & server_controls_ht , & retdata , & retoid ) != SUCCESS ) {
38793879 RETURN_THROWS ();
38803880 }
38813881
@@ -3889,8 +3889,8 @@ static void php_ldap_exop(INTERNAL_FUNCTION_PARAMETERS, bool force_sync) {
38893889 lreqdata .bv_len = 0 ;
38903890 }
38913891
3892- if (serverctrls ) {
3893- lserverctrls = _php_ldap_controls_from_array (ld -> link , serverctrls , 4 );
3892+ if (server_controls_ht ) {
3893+ lserverctrls = php_ldap_controls_from_array (ld -> link , server_controls_ht , 4 );
38943894 if (lserverctrls == NULL ) {
38953895 RETVAL_FALSE ;
38963896 goto cleanup ;
0 commit comments