From b74989d202bef0de9a4970e7c7f153ba52519ba9 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Tue, 16 May 2006 22:38:15 +0000 Subject: [PATCH] ITS#4450 fix from HEAD --- CHANGES | 3 +++ build/version.var | 2 +- servers/slapd/back-ldap/extended.c | 16 ++++++++++------ servers/slapd/back-ldap/search.c | 9 ++++++--- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/CHANGES b/CHANGES index 76d74d3b6d..6e1b14574b 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,8 @@ OpenLDAP 2.3 Change Log +OpenLDAP 2.3.23 Engineering + Fixed slapd-ldap improper free bug (ITS#4450) + OpenLDAP 2.3.22 Release Fixed libldap referral input destroy issue (ITS#4533) Fixed libldap ldap_sort_entries tail bug (ITS#4536) diff --git a/build/version.var b/build/version.var index 81259094c9..6878f10096 100644 --- a/build/version.var +++ b/build/version.var @@ -15,7 +15,7 @@ ol_package=OpenLDAP ol_major=2 ol_minor=3 -ol_patch=22 +ol_patch=X ol_api_inc=20322 ol_api_current=2 ol_api_revision=10 diff --git a/servers/slapd/back-ldap/extended.c b/servers/slapd/back-ldap/extended.c index 225eee430d..0b38b7b4db 100644 --- a/servers/slapd/back-ldap/extended.c +++ b/servers/slapd/back-ldap/extended.c @@ -112,6 +112,7 @@ ldap_back_exop_passwd( ber_int_t msgid; int rc, isproxy; int do_retry = 1; + char *text = NULL; lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR ); if ( !lc || !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) { @@ -140,7 +141,7 @@ retry: */ rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err, (char **)&rs->sr_matched, - (char **)&rs->sr_text, + &text, NULL, NULL, 0 ); #ifndef LDAP_NULL_IS_NULL if ( rs->sr_matched && rs->sr_matched[ 0 ] == '\0' ) { @@ -190,6 +191,7 @@ retry: goto retry; } } + if ( text ) rs->sr_text = text; send_ldap_extended( op, rs ); /* otherwise frontend resends result */ rc = rs->sr_err = SLAPD_ABANDON; @@ -201,8 +203,8 @@ retry: rs->sr_matched = NULL; } - if ( rs->sr_text ) { - free( (char *)rs->sr_text ); + if ( text ) { + free( text ); rs->sr_text = NULL; } @@ -223,6 +225,7 @@ ldap_back_exop_generic( ber_int_t msgid; int rc; int do_retry = 1; + char *text = NULL; lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR ); if ( !lc || !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) { @@ -248,7 +251,7 @@ retry: */ rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err, (char **)&rs->sr_matched, - (char **)&rs->sr_text, + text, NULL, NULL, 0 ); #ifndef LDAP_NULL_IS_NULL if ( rs->sr_matched && rs->sr_matched[ 0 ] == '\0' ) { @@ -284,6 +287,7 @@ retry: goto retry; } } + if ( text ) rs->sr_text = text; send_ldap_extended( op, rs ); /* otherwise frontend resends result */ rc = rs->sr_err = SLAPD_ABANDON; @@ -295,8 +299,8 @@ retry: rs->sr_matched = NULL; } - if ( rs->sr_text ) { - free( (char *)rs->sr_text ); + if ( text ) { + free( text ); rs->sr_text = NULL; } diff --git a/servers/slapd/back-ldap/search.c b/servers/slapd/back-ldap/search.c index 69c013d834..3745d2888d 100644 --- a/servers/slapd/back-ldap/search.c +++ b/servers/slapd/back-ldap/search.c @@ -375,16 +375,19 @@ retry: } } else { - char **references = NULL; + char **references = NULL, *err = NULL; rc = ldap_parse_result( lc->lc_ld, res, &rs->sr_err, - &match.bv_val, (char **)&rs->sr_text, + &match.bv_val, &err, &references, &rs->sr_ctrls, 1 ); - freetext = 1; if ( rc != LDAP_SUCCESS ) { rs->sr_err = rc; } rs->sr_err = slap_map_api2result( rs ); + if ( err ) { + rs->sr_text = err; + freetext = 1; + } if ( references && references[ 0 ] && references[ 0 ][ 0 ] ) { int cnt; -- 2.39.5