]> git.sur5r.net Git - openldap/commitdiff
ITS#4746 additional leaks
authorHoward Chu <hyc@openldap.org>
Mon, 13 Nov 2006 02:57:20 +0000 (02:57 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 13 Nov 2006 02:57:20 +0000 (02:57 +0000)
servers/slapd/syncrepl.c

index 91acfc19d175c62c1f4cdf349d1ea70dca3fdd2c..7ff479ae1812a4c91e7ab78568ed93f9883b38e3 100644 (file)
@@ -1265,7 +1265,7 @@ syncrepl_message_to_op(
        struct berval   rdn = BER_BVNULL, sup = BER_BVNULL,
                prdn = BER_BVNULL, nrdn = BER_BVNULL,
                psup = BER_BVNULL, nsup = BER_BVNULL;
-       int             rc, deleteOldRdn = 0;
+       int             rc, deleteOldRdn = 0, freeReqDn = 0;
 
        if ( ldap_msgtype( msg ) != LDAP_RES_SEARCH_ENTRY ) {
                Debug( LDAP_DEBUG_ANY,
@@ -1300,6 +1300,7 @@ syncrepl_message_to_op(
                        ber_dupbv( &op->o_req_ndn, &ndn );
                        slap_sl_free( ndn.bv_val, op->o_tmpmemctx );
                        slap_sl_free( dn.bv_val, op->o_tmpmemctx );
+                       freeReqDn = 1;
                } else if ( !ber_bvstrcasecmp( &bv, &ls->ls_req )) {
                        int i = verb_to_mask( bvals[0].bv_val, modops );
                        if ( i < 0 ) {
@@ -1358,6 +1359,7 @@ syncrepl_message_to_op(
                        op->ora_e = ( Entry * ) ch_calloc( 1, sizeof( Entry ) );
                        op->ora_e->e_name = op->o_req_dn;
                        op->ora_e->e_nname = op->o_req_ndn;
+                       freeReqDn = 0;
                        rc = slap_mods2entry( modlist, &op->ora_e, 1, 0, &text, txtbuf, textlen);
                        if( rc != LDAP_SUCCESS ) {
                                Debug( LDAP_DEBUG_ANY, "syncrepl_message_to_op: mods2entry (%s)\n",
@@ -1424,6 +1426,10 @@ done:
                if ( !BER_BVISNULL( &prdn ))
                        ch_free( prdn.bv_val );
        }
+       if ( freeReqDn ) {
+               ch_free( op->o_req_ndn.bv_val );
+               ch_free( op->o_req_dn.bv_val );
+       }
        ber_free ( ber, 0 );
        return rc;
 }