]> git.sur5r.net Git - openldap/commitdiff
ITS#4450 fix from HEAD
authorKurt Zeilenga <kurt@openldap.org>
Tue, 16 May 2006 22:38:15 +0000 (22:38 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Tue, 16 May 2006 22:38:15 +0000 (22:38 +0000)
CHANGES
build/version.var
servers/slapd/back-ldap/extended.c
servers/slapd/back-ldap/search.c

diff --git a/CHANGES b/CHANGES
index 76d74d3b6d0c0b478a6f482cda47427b7d7fb4aa..6e1b14574b48921367e953983ef14de395d3c1ee 100644 (file)
--- 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)
index 81259094c9e985d179c80b765cb1340fa732dfcb..6878f10096ea689aa88f6a374c66b52c186b5f61 100644 (file)
@@ -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
index 225eee430d9cf0eb36685750c4349bcfa76be7fb..0b38b7b4db67285e8709f4ceb033c8b13bdace8d 100644 (file)
@@ -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;
        }
 
index 69c013d834f8a7413c959ef780110328b63b1e8d..3745d2888d964b5c82f025e709a6b225cbad7723 100644 (file)
@@ -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;