]> git.sur5r.net Git - openldap/commitdiff
Added dn_rdnlen. Fixed rdn leak in limits.c.
authorHoward Chu <hyc@openldap.org>
Sat, 8 Dec 2001 11:08:26 +0000 (11:08 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 8 Dec 2001 11:08:26 +0000 (11:08 +0000)
servers/slapd/acl.c
servers/slapd/back-bdb/dn2id.c
servers/slapd/dn.c
servers/slapd/limits.c
servers/slapd/proto-slap.h

index 7c8a3a0a953b2e1d15fc6ab28e941a4d2fb021f7..193eba4d0c92d66dfdeb0d57f4f2269e0a8bcf89 100644 (file)
@@ -355,11 +355,7 @@ acl_get(
                                        if ( !DN_SEPARATOR( e->e_ndn[dnlen - patlen - 1] ) || DN_ESCAPE( e->e_ndn[dnlen - patlen - 2] ) )
                                                continue;
 
-                                       rdn = dn_rdn( NULL, e->e_ndn );
-                                       if ( rdn != NULL ) {
-                                               rdnlen = strlen( rdn );
-                                               ch_free( rdn );
-                                       }
+                                       rdnlen = dn_rdnlen( NULL, e->e_ndn );
                                        if ( rdnlen != dnlen - patlen - 1 )
                                                continue;
 
@@ -562,11 +558,7 @@ acl_mask(
                                        if ( !DN_SEPARATOR( op->o_ndn[odnlen - patlen - 1] ) || DN_ESCAPE( op->o_ndn[odnlen - patlen - 2] ) )
                                                continue;
 
-                                       rdn = dn_rdn( NULL, op->o_ndn );
-                                       if ( rdn != NULL ) {
-                                               rdnlen = strlen( rdn );
-                                               ch_free( rdn );
-                                       }
+                                       rdnlen = dn_rdnlen( NULL, op->o_ndn );
                                        if ( rdnlen != odnlen - patlen - 1 )
                                                continue;
 
index 8606ea388965cf8fa30738140f8111e9faee7987..41e74eda9b110abc084d8bae8c788154b2b5b92e 100644 (file)
@@ -678,32 +678,24 @@ bdb_dn2id_add(
        int             rc, rlen, nrlen;
        DBT             key, data;
        DB *db = bdb->bi_id2parent->bdi_db;
-       char            *nrdn = dn_rdn( be, e->e_ndn );
-       char            *rdn;
        diskNode *d;
        idNode *n;
 
-       if (nrdn == NULL) {
-               nrdn = "";
-               rdn = "";
-       } else {
-               rdn = dn_rdn( be, e->e_dn );
-       }
+       nrlen = dn_rdnlen( be, e->e_ndn );
+       rlen = dn_rdnlen( be, e->e_dn );
 
-       nrlen = strlen(nrdn);
-       rlen = strlen(rdn);
        d = ch_malloc(sizeof(diskNode) + rlen + nrlen + 2);
        d->rdn.bv_len = rlen;
        d->nrdn.bv_len = nrlen;
        d->rdn.bv_val = (char *)(d+1);
-       d->nrdn.bv_val = bdb_strcopy(d->rdn.bv_val, rdn) + 1;
-       strcpy(d->nrdn.bv_val, nrdn);
+       d->nrdn.bv_val = d->rdn.bv_val + rlen + 1;
+       strncpy(d->rdn.bv_val, e->e_dn, rlen);
+       d->rdn.bv_val[rlen] = '\0';
+       strncpy(d->nrdn.bv_val, e->e_ndn, nrlen);
+       d->nrdn.bv_val[nrlen] = '\0';
        d->rdn.bv_val -= (long)d;
        d->nrdn.bv_val -= (long)d;
 
-       if (nrdn[0]) free(nrdn);
-       if (rdn[0]) free(rdn);
-
        if (pdn) {
                bdb_dn2id(be, txn, pdn, &d->parent);
        } else {
index 65e775060ddf8fd30487fedcafb742fa121e8d6e..a82be0b649586ec2a45ef83176bda67438050acf 100644 (file)
@@ -369,7 +369,7 @@ dn_parent(
        return "";
 }
 
-char * dn_rdn(
+int dn_rdnlen(
        Backend *be,
        const char      *dn_in )
 {
@@ -377,7 +377,7 @@ char * dn_rdn(
        int     inquote;
 
        if( dn_in == NULL ) {
-               return NULL;
+               return 0;
        }
 
        while(*dn_in && ASCII_SPACE(*dn_in)) {
@@ -385,14 +385,14 @@ char * dn_rdn(
        }
 
        if( *dn_in == '\0' ) {
-               return( NULL );
+               return( 0 );
        }
 
        if ( be != NULL && be_issuffix( be, dn_in ) ) {
-               return( NULL );
+               return( 0 );
        }
 
-       dn = ch_strdup( dn_in );
+       dn = dn_in;
 
        inquote = 0;
 
@@ -411,15 +411,26 @@ char * dn_rdn(
                        if ( *s == '"' ) {
                                inquote = 1;
                        } else if ( DN_SEPARATOR( *s ) ) {
-                               *s = '\0';
-                               return( dn );
+                               break;
                        }
                }
        }
 
-       return( dn );
+       return( s - dn );
 }
 
+char * dn_rdn(
+       Backend *be,
+       const char      *dn_in )
+{
+       char *rdn;
+       int i = dn_rdnlen( be, dn_in );
+
+       rdn = ch_malloc( i + 1 );
+       strncpy(rdn, dn_in, i);
+       rdn[i] = '\0';
+       return rdn;
+}
 
 /*
  * return a charray of all subtrees to which the DN resides in
index f45785921de596a55b0385b671d236f687de423c..fb65b4c13efcbdcc69390bf0304cdd0b324d2362 100644 (file)
@@ -75,16 +75,13 @@ get_limits(
 
                        /* in case of (sub)match ... */
                        if ( strcmp( lm[0]->lm_dn_pat->bv_val, &ndn[d] ) == 0 ) {
-                               /* check for exacctly one rdn in case of ONE */
+                               /* check for exactly one rdn in case of ONE */
                                if ( lm[0]->lm_type == SLAP_LIMITS_ONE ) {
-                                       char *rdn;
-                                       
                                        /*
                                         * if ndn is more that one rdn
                                         * below dn_pat, continue
                                         */
-                                       rdn = dn_rdn( NULL, ndn );
-                                       if ( strlen( rdn ) != d - 1 ) {
+                                       if ( dn_rdnlen( NULL, ndn ) != d - 1 ) {
                                                break;
                                        }
                                }
index 8b3539f7454c7175baf84ce8212c69a257311d81..91442664800fc3602caf585dbf2a7cafc6518bd2 100644 (file)
@@ -321,6 +321,7 @@ LDAP_SLAPD_F (int) dn_match LDAP_P(( const char *val, const char *asserted ));
 LDAP_SLAPD_F (char *) dn_parent LDAP_P(( Backend *be, const char *dn ));
 LDAP_SLAPD_F (char **) dn_subtree LDAP_P(( Backend *be, const char *dn ));
 LDAP_SLAPD_F (char *) dn_rdn LDAP_P(( Backend *be, const char *dn ));
+LDAP_SLAPD_F (int) dn_rdnlen LDAP_P(( Backend *be, const char *dn ));
 LDAP_SLAPD_F (int) dn_issuffix LDAP_P(( const char *dn, const char *suffix ));
 LDAP_SLAPD_F (int) rdn_validate LDAP_P(( const char* str ));
 LDAP_SLAPD_F (char *) rdn_attr_value LDAP_P(( const char * rdn ));