]> git.sur5r.net Git - openldap/commitdiff
More malloc cleanup
authorHoward Chu <hyc@openldap.org>
Sun, 19 Oct 2003 00:30:55 +0000 (00:30 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 19 Oct 2003 00:30:55 +0000 (00:30 +0000)
servers/slapd/ctxcsn.c
servers/slapd/syncrepl.c

index a2500c870250ebe552d778d00ca3c488e86716ec..8b0b3e8917fc77ca1eb658e1de71ee3dddd0a8f8 100644 (file)
@@ -187,14 +187,11 @@ slap_get_csn(
        if ( csn == NULL )
                return LDAP_OTHER;
 
-       if ( manage_ctxcsn ) {
-               pending = (struct slap_csn_entry *) ch_calloc( 1, sizeof( struct slap_csn_entry ));
-       }
-
        csn->bv_len = lutil_csnstr( csnbuf, len, 0, 0 );
        csn->bv_val = csnbuf;
 
        if ( manage_ctxcsn ) {
+               pending = (struct slap_csn_entry *) ch_calloc( 1, sizeof( struct slap_csn_entry ));
                ldap_pvt_thread_mutex_lock( &op->o_bd->be_pcl_mutex );
                pending->csn = ber_dupbv( NULL, csn );
                pending->connid = op->o_connid;
index d4548cfbc24874218e39259b7c74deab5ff732a3..2acbcf64efd293f072e521b4da797102e3acf509 100644 (file)
@@ -1060,6 +1060,11 @@ syncrepl_del_nonpresent(
 }
 
 
+static struct berval gcbva[] = {
+       BER_BVC("top"),
+       BER_BVC("glue")
+};
+
 void
 syncrepl_add_glue(
        syncinfo_t *si,
@@ -1076,67 +1081,75 @@ syncrepl_add_glue(
        slap_callback cb;
        Attribute       *a;
        int     rc;
-       int levels = 0;
-       int i, j, k;
+       int suffrdns;
+       int i;
        struct berval dn = {0, NULL};
-       struct berval pdn = {0, NULL};
        struct berval ndn = {0, NULL};
-       struct berval rdn = {0, NULL};
        Entry   *glue;
        SlapReply       rs = {REP_RESULT};
-       Connection *conn = op->o_conn;
-       char* ptr;
+       char    *ptr, *comma;
 
        op->o_tag = LDAP_REQ_ADD;
        op->o_callback = &cb;
        cb.sc_response = null_callback;
        cb.sc_private = si;
 
-       ber_dupbv( &dn, &e->e_nname );
-       ber_dupbv( &pdn, &e->e_nname );
+       dn = e->e_name;
+       ndn = e->e_nname;
 
-       ptr = dn.bv_val;
-       while ( !be_issuffix ( be, &pdn )) {
-               dnParent( &dn, &pdn );
-               dn.bv_val = pdn.bv_val;
-               dn.bv_len = pdn.bv_len;
-               levels++;
-       }
-       ch_free( ptr );
-
-       for ( i = 0; i <= levels; i++ ) {
-               glue = (Entry*) ch_calloc( 1, sizeof(Entry) );
-               ber_dupbv( &dn, &e->e_nname );
-               j = levels - i;
-
-               ptr = dn.bv_val;
-               for ( k = 0; k < j; k++ ) {
-                       dnParent( &dn, &pdn );
-                       dn.bv_val = pdn.bv_val;
-                       dn.bv_len = pdn.bv_len;
+       /* count RDNs in suffix */
+       if ( be->be_nsuffix[0].bv_len ) {
+               for (i=0, ptr=be->be_nsuffix[0].bv_val; ptr; ptr=strchr( ptr, ',' )) {
+                       ptr++;
+                       i++;
                }
+               suffrdns = i+1;
+       } else {
+               /* suffix is "" */
+               suffrdns = 0;
+       }
+
+       /* advance to first child: count RDN separators since the prettyDNs
+        * may not be exactly the same length
+        */
+       for ( i = 0, ptr = NULL; i < suffrdns; i++ ) {
+               comma = strrchr(dn.bv_val, ',');
+               if ( ptr ) *ptr = ',';
+               if ( comma ) *comma = '\0';
+               ptr = comma;
+       }
+       if ( ptr ) {
+               *ptr++ = ',';
+               dn.bv_len -= ptr - dn.bv_val;
+               dn.bv_val = ptr;
+       }
+       /* the normalizedDNs are always the same length, no counting
+        * required.
+        */
+       if ( ndn.bv_len > be->be_nsuffix[0].bv_len ) {
+               comma = ndn.bv_val + ndn.bv_len - be->be_nsuffix[0].bv_len - 1;
+               *comma = '\0';
+               ptr = strrchr( ndn.bv_val, ',' ) + 1;
+               *comma = ',';
+               ndn.bv_len -= ptr - ndn.bv_val;
+               ndn.bv_val = ptr;
+       }
 
-               dnPrettyNormal( 0, &dn, &pdn, &ndn, op->o_tmpmemctx );
-               ber_dupbv( &glue->e_name, &pdn );
+       while ( ndn.bv_val > e->e_nname.bv_val ) {
+               glue = (Entry *) ch_calloc( 1, sizeof(Entry) );
+               ber_dupbv( &glue->e_name, &dn );
                ber_dupbv( &glue->e_nname, &ndn );
-               ch_free( ptr );
-               ch_free( pdn.bv_val );
-               ch_free( ndn.bv_val );
 
                a = ch_calloc( 1, sizeof( Attribute ));
                a->a_desc = slap_schema.si_ad_objectClass;
 
                a->a_vals = ch_calloc( 3, sizeof( struct berval ));
-               ber_str2bv( "top", strlen("top"), 1, &a->a_vals[0] );
-               ber_str2bv( "glue", strlen("glue"), 1, &a->a_vals[1] );
+               ber_dupbv( &a->a_vals[0], &gcbva[0] );
+               ber_dupbv( &a->a_vals[1], &gcbva[1] );
                a->a_vals[2].bv_len = 0;
                a->a_vals[2].bv_val = NULL;
 
-               a->a_nvals = ch_calloc( 3, sizeof( struct berval ));
-               ber_str2bv( "top", strlen("top"), 1, &a->a_nvals[0] );
-               ber_str2bv( "glue", strlen("glue"), 1, &a->a_nvals[1] );
-               a->a_nvals[2].bv_len = 0;
-               a->a_nvals[2].bv_val = NULL;
+               a->a_nvals = a->a_vals;
 
                a->a_next = glue->e_attrs;
                glue->e_attrs = a;
@@ -1145,42 +1158,45 @@ syncrepl_add_glue(
                a->a_desc = slap_schema.si_ad_structuralObjectClass;
 
                a->a_vals = ch_calloc( 2, sizeof( struct berval ));
-               ber_str2bv( "glue", strlen("glue"), 1, &a->a_vals[0] );
+               ber_dupbv( &a->a_vals[0], &gcbva[1] );
                a->a_vals[1].bv_len = 0;
                a->a_vals[1].bv_val = NULL;
 
-               a->a_nvals = ch_calloc( 2, sizeof( struct berval ));
-               ber_str2bv( "glue", strlen("glue"), 1, &a->a_nvals[0] );
-               a->a_nvals[1].bv_len = 0;
-               a->a_nvals[1].bv_val = NULL;
+               a->a_nvals = a->a_vals;
 
                a->a_next = glue->e_attrs;
                glue->e_attrs = a;
 
-               if ( !strcmp( e->e_nname.bv_val, glue->e_nname.bv_val )) {
-                       op->o_req_dn = e->e_name;
-                       op->o_req_ndn = e->e_nname;
-                       op->ora_e = e;
-                       rc = be->be_add ( op, &rs );
-                       if ( rc == LDAP_SUCCESS )
-                               be_entry_release_w( op, e );
-                       else 
-                               entry_free( e );
-                       entry_free( glue );
+               op->o_req_dn = glue->e_name;
+               op->o_req_ndn = glue->e_nname;
+               op->ora_e = glue;
+               rc = be->be_add ( op, &rs );
+               if ( rc == LDAP_SUCCESS ) {
+                       be_entry_release_w( op, glue );
                } else {
-                       op->o_req_dn = glue->e_name;
-                       op->o_req_ndn = glue->e_nname;
-                       op->ora_e = glue;
-                       rc = be->be_add ( op, &rs );
-                       if ( rc == LDAP_SUCCESS ) {
-                               be_entry_release_w( op, glue );
-                       } else {
-                       /* incl. ALREADY EXIST */
-                               entry_free( glue );
-                       }
+               /* incl. ALREADY EXIST */
+                       entry_free( glue );
                }
+
+               /* Move to next child */
+               for (ptr = dn.bv_val-2; ptr > e->e_name.bv_val && *ptr != ','; ptr--);
+               if ( ptr == e->e_name.bv_val ) break;
+               dn.bv_val = ptr+1;
+               dn.bv_len = e->e_name.bv_len - (ptr-e->e_name.bv_val);
+               for (ptr = ndn.bv_val-2; ptr > e->e_nname.bv_val && *ptr != ','; ptr--);
+               ndn.bv_val = ptr+1;
+               ndn.bv_len = e->e_nname.bv_len - (ptr-e->e_nname.bv_val);
        }
 
+       op->o_req_dn = e->e_name;
+       op->o_req_ndn = e->e_nname;
+       op->ora_e = e;
+       rc = be->be_add ( op, &rs );
+       if ( rc == LDAP_SUCCESS )
+               be_entry_release_w( op, e );
+       else 
+               entry_free( e );
+
        return;
 }
 
@@ -1202,7 +1218,7 @@ static struct berval ssbva[] = {
 };
 
 static struct berval scbva[] = {
-       BER_BVC("subentry"),
+       BER_BVNULL,
        BER_BVNULL
 };
 
@@ -1229,6 +1245,7 @@ syncrepl_updateCookie(
        Entry* e = NULL;
        int rc;
 
+       char syncrepl_cbuf[sizeof(CN_STR SYNCREPL_STR)];
        struct berval slap_syncrepl_dn_bv = BER_BVNULL;
        struct berval slap_syncrepl_cn_bv = BER_BVNULL;
        
@@ -1260,6 +1277,7 @@ syncrepl_updateCookie(
        *modtail = mod;
        modtail = &mod->sml_next;
 
+       if ( scbva[0].bv_val ) ch_free( scbva[0].bv_val );
        ber_dupbv( &scbva[0], si->syncCookie );
        mod = (Modifications *) ch_calloc( 1, sizeof( Modifications ));
        mod->sml_op = LDAP_MOD_REPLACE;
@@ -1277,26 +1295,13 @@ syncrepl_updateCookie(
        *modtail = mod;
        modtail = &mod->sml_next;
 
-#if 0
-       rc = slap_mods_check( modlist, 1, &text, txtbuf, textlen, NULL );
-
-       if ( rc != LDAP_SUCCESS ) {
-#ifdef NEW_LOGGING
-               LDAP_LOG( OPERATION, ERR,
-                               "syncrepl_updateCookie: mods check (%s)\n", text, 0, 0 );
-#else
-               Debug( LDAP_DEBUG_ANY, "syncrepl_updateCookie: mods check (%s)\n",
-                        text, 0, 0 );
-#endif
-       }
-#endif
+       mlnext = mod;
 
        op->o_tag = LDAP_REQ_ADD;
        rc = slap_mods_opattrs( op, modlist, modtail,
                                                         &text,txtbuf, textlen );
 
-       for ( ml = modlist; ml != NULL; ml = mlnext ) {
-               mlnext = ml->sml_next;
+       for ( ml = modlist; ml != NULL; ml = ml->sml_next ) {
                ml->sml_op = LDAP_MOD_REPLACE;
        }
 
@@ -1312,18 +1317,17 @@ syncrepl_updateCookie(
 
        e = ( Entry * ) ch_calloc( 1, sizeof( Entry ));
 
-       ber_dupbv( &slap_syncrepl_cn_bv, (struct berval *) &slap_syncrepl_cn_bvc );
+       slap_syncrepl_cn_bv.bv_val = syncrepl_cbuf;
        slap_syncrepl_cn_bv.bv_len = snprintf( slap_syncrepl_cn_bv.bv_val,
                                                                                slap_syncrepl_cn_bvc.bv_len,
                                                                                "cn=syncrepl%d", si->id );
 
-       build_new_dn( &slap_syncrepl_dn_bv, pdn, &slap_syncrepl_cn_bv, NULL );
-       dnPrettyNormal( NULL, &slap_syncrepl_dn_bv, &e->e_name, &e->e_nname, NULL );
+       build_new_dn( &slap_syncrepl_dn_bv, pdn, &slap_syncrepl_cn_bv, op->o_tmpmemctx );
+       ber_dupbv( &e->e_name, &slap_syncrepl_dn_bv );
+       ber_dupbv( &e->e_nname, &slap_syncrepl_dn_bv );
 
-       if ( slap_syncrepl_cn_bv.bv_val )
-               ch_free( slap_syncrepl_cn_bv.bv_val );
        if ( slap_syncrepl_dn_bv.bv_val )
-               ch_free( slap_syncrepl_dn_bv.bv_val );
+               sl_free( slap_syncrepl_dn_bv.bv_val, op->o_tmpmemctx );
 
        e->e_attrs = NULL;
 
@@ -1404,10 +1408,21 @@ update_cookie_retry:
 
 done :
 
-       if ( cnbva[0].bv_val )
+       if ( cnbva[0].bv_val ) {
                ch_free( cnbva[0].bv_val );
+               cnbva[0].bv_val = NULL;
+       }
+       if ( scbva[0].bv_val ) {
+               ch_free( scbva[0].bv_val );
+               scbva[0].bv_val = NULL;
+       }
+
+       if ( mlnext->sml_next ) {
+               slap_mods_free( mlnext->sml_next );
+               mlnext->sml_next = NULL;
+       }
 
-       for ( ; ml != NULL; ml = mlnext ) {
+       for (ml = modlist ; ml != NULL; ml = mlnext ) {
                mlnext = ml->sml_next;
                free( ml );
        }