jani Fri Jul 13 01:24:16 2007 UTC Modified files: (Branch: PHP_5_2) /php-src NEWS /php-src/ext/ldap ldap.c php_ldap.h Log: MFH:- Fixed bug #41127 (Memory leak in ldap_{first|next}_attribute functions) # This removes an useless parameter from 2 functions. Perhaps the next # release should be 5.3.0, there are lot of other new things done already. # Sneak in namespaces too.. ;) http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.833&r2=1.2027.2.547.2.834&diff_format=u Index: php-src/NEWS diff -u php-src/NEWS:1.2027.2.547.2.833 php-src/NEWS:1.2027.2.547.2.834 --- php-src/NEWS:1.2027.2.547.2.833 Thu Jul 12 22:08:58 2007 +++ php-src/NEWS Fri Jul 13 01:24:15 2007 @@ -142,6 +142,8 @@ integer as sections). (Tony) - Fixed bug #41350 (my_thread_global_end() error during request shutdown on Windows). (Scott, Andrey) +- Fixed bug #41127 (Memory leak in ldap_{first|next}_attribute functions). + (Jani) - Fixed bug #40419 (Trailing slash in CGI request does not work). (Dmitry) - Fixed bug #39330 (apache2handler does not call shutdown actions before apache child die). (isk at ecommerce dot com, Gopal, Tony) http://cvs.php.net/viewvc.cgi/php-src/ext/ldap/ldap.c?r1=1.161.2.3.2.6&r2=1.161.2.3.2.7&diff_format=u Index: php-src/ext/ldap/ldap.c diff -u php-src/ext/ldap/ldap.c:1.161.2.3.2.6 php-src/ext/ldap/ldap.c:1.161.2.3.2.7 --- php-src/ext/ldap/ldap.c:1.161.2.3.2.6 Thu Jul 12 22:08:58 2007 +++ php-src/ext/ldap/ldap.c Fri Jul 13 01:24:16 2007 @@ -23,7 +23,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ldap.c,v 1.161.2.3.2.6 2007/07/12 22:08:58 jani Exp $ */ +/* $Id: ldap.c,v 1.161.2.3.2.7 2007/07/13 01:24:16 jani Exp $ */ #define IS_EXT_MODULE #ifdef HAVE_CONFIG_H @@ -75,6 +75,7 @@ typedef struct { LDAPMessage *data; + BerElement *ber; int id; } ldap_resultentry; @@ -91,7 +92,7 @@ ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO(); -static int le_link, le_result, le_result_entry, le_ber_entry; +static int le_link, le_result, le_result_entry; /* This is just a small subset of the functionality provided by the LDAP library. All the @@ -217,6 +218,10 @@ static void _free_ldap_result_entry(zend_rsrc_list_entry *rsrc TSRMLS_DC) { ldap_resultentry *entry = (ldap_resultentry *)rsrc->ptr; + + if (entry->ber != NULL) { + ber_free(entry->ber, 0); + } zend_list_delete(entry->id); efree(entry); } @@ -286,10 +291,9 @@ REGISTER_LONG_CONSTANT("GSLC_SSL_TWOWAY_AUTH", GSLC_SSL_TWOWAY_AUTH, CONST_PERSISTENT | CONST_CS); #endif - le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number); le_link = zend_register_list_destructors_ex(_close_ldap_link, NULL, "ldap link", module_number); + le_result = zend_register_list_destructors_ex(_free_ldap_result, NULL, "ldap result", module_number); le_result_entry = zend_register_list_destructors_ex(_free_ldap_result_entry, NULL, "ldap result entry", module_number); - le_ber_entry = zend_register_list_destructors_ex(NULL, NULL, "ldap ber entry", module_number); Z_TYPE(ldap_module_entry) = type; @@ -318,7 +322,7 @@ php_info_print_table_start(); php_info_print_table_row(2, "LDAP Support", "enabled"); - php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 1.161.2.3.2.6 2007/07/12 22:08:58 jani Exp $"); + php_info_print_table_row(2, "RCS Version", "$Id: ldap.c,v 1.161.2.3.2.7 2007/07/13 01:24:16 jani Exp $"); if (LDAPG(max_links) == -1) { snprintf(tmp, 31, "%ld/unlimited", LDAPG(num_links)); @@ -993,6 +997,7 @@ resultentry->id = Z_LVAL_PP(result); zend_list_addref(resultentry->id); resultentry->data = entry; + resultentry->ber = NULL; } } /* }}} */ @@ -1021,6 +1026,7 @@ resultentry_next->id = resultentry->id; zend_list_addref(resultentry->id); resultentry_next->data = entry_next; + resultentry_next->ber = NULL; } } /* }}} */ @@ -1091,8 +1097,9 @@ attribute = ldap_next_attribute(ldap, ldap_result_entry, ber); } #if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS - if (ber != NULL) + if (ber != NULL) { ber_free(ber, 0); + } #endif add_assoc_long(tmp1, "count", num_attrib); @@ -1115,28 +1122,25 @@ } /* }}} */ -/* {{{ proto string ldap_first_attribute(resource link, resource result_entry, int ber) +/* {{{ proto string ldap_first_attribute(resource link, resource result_entry) Return first attribute */ PHP_FUNCTION(ldap_first_attribute) { - zval **link, **result_entry, **berp; + zval **link, **result_entry; ldap_linkdata *ld; ldap_resultentry *resultentry; - BerElement *ber; char *attribute; - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &link, &result_entry, &berp) == FAILURE) { + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result_entry) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry); - if ((attribute = ldap_first_attribute(ld->link, resultentry->data, &ber)) == NULL) { + if ((attribute = ldap_first_attribute(ld->link, resultentry->data, &resultentry->ber)) == NULL) { RETURN_FALSE; } else { - ZEND_REGISTER_RESOURCE(*berp, ber, le_ber_entry); - RETVAL_STRING(attribute, 1); #if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS ldap_memfree(attribute); @@ -1145,29 +1149,31 @@ } /* }}} */ -/* {{{ proto string ldap_next_attribute(resource link, resource result_entry, resource ber) +/* {{{ proto string ldap_next_attribute(resource link, resource result_entry) Get the next attribute in result */ PHP_FUNCTION(ldap_next_attribute) { - zval **link, **result_entry, **berp; + zval **link, **result_entry; ldap_linkdata *ld; ldap_resultentry *resultentry; - BerElement *ber; char *attribute; - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &link, &result_entry, &berp) == FAILURE) { + if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &link, &result_entry) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(ld, ldap_linkdata *, link, -1, "ldap link", le_link); ZEND_FETCH_RESOURCE(resultentry, ldap_resultentry *, result_entry, -1, "ldap result entry", le_result_entry); - ZEND_FETCH_RESOURCE(ber, BerElement *, berp, -1, "ldap ber entry", le_ber_entry); - if ((attribute = ldap_next_attribute(ld->link, resultentry->data, ber)) == NULL) { + if ((attribute = ldap_next_attribute(ld->link, resultentry->data, resultentry->ber)) == NULL) { +#if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS + if (resultentry->ber != NULL) { + ber_free(resultentry->ber, 0); + resultentry->ber = NULL; + } +#endif RETURN_FALSE; } else { - ZEND_REGISTER_RESOURCE(*berp, ber, le_ber_entry); - RETVAL_STRING(attribute, 1); #if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS ldap_memfree(attribute); @@ -1222,9 +1228,9 @@ attribute = ldap_next_attribute(ld->link, resultentry->data, ber); } #if (LDAP_API_VERSION > 2000) || HAVE_NSLDAP || HAVE_ORALDAP_10 || WINDOWS - if (ber != NULL) { - ber_free(ber, 0); - } + if (ber != NULL) { + ber_free(ber, 0); + } #endif add_assoc_long(return_value, "count", num_attrib); http://cvs.php.net/viewvc.cgi/php-src/ext/ldap/php_ldap.h?r1=1.32.2.1.2.1&r2=1.32.2.1.2.2&diff_format=u Index: php-src/ext/ldap/php_ldap.h diff -u php-src/ext/ldap/php_ldap.h:1.32.2.1.2.1 php-src/ext/ldap/php_ldap.h:1.32.2.1.2.2 --- php-src/ext/ldap/php_ldap.h:1.32.2.1.2.1 Mon Jan 1 09:36:02 2007 +++ php-src/ext/ldap/php_ldap.h Fri Jul 13 01:24:16 2007 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_ldap.h,v 1.32.2.1.2.1 2007/01/01 09:36:02 sebastian Exp $ */ +/* $Id: php_ldap.h,v 1.32.2.1.2.2 2007/07/13 01:24:16 jani Exp $ */ #ifndef PHP_LDAP_H #define PHP_LDAP_H @@ -55,7 +55,6 @@ PHP_FUNCTION(ldap_get_attributes); PHP_FUNCTION(ldap_get_values); PHP_FUNCTION(ldap_get_values_len); -PHP_FUNCTION(ber_free); PHP_FUNCTION(ldap_get_dn); PHP_FUNCTION(ldap_explode_dn); PHP_FUNCTION(ldap_dn2ufn);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php