]> git.sur5r.net Git - openldap/commitdiff
Change slap_ad_undef_remove() to slap_ad_undef_promote().
authorHoward Chu <hyc@openldap.org>
Wed, 14 Sep 2005 06:17:59 +0000 (06:17 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 14 Sep 2005 06:17:59 +0000 (06:17 +0000)
AttributeDescriptions must never be freed in a running slapd.

servers/slapd/ad.c
servers/slapd/at.c
servers/slapd/proto-slap.h

index 2b32e533c78812a9e425f7a2316a152c67852815..676cf8d86f39d2881600b2d4d7907132c5c8cbf2 100644 (file)
@@ -770,11 +770,15 @@ int slap_bv2undef_ad(
 }
 
 static int
-undef_remove(
+undef_promote(
        AttributeType   *at,
-       char            *name )
+       char            *name,
+       AttributeType   *nat )
 {
-       AttributeDescription    **u_ad;
+       AttributeDescription    **u_ad, **n_ad;
+
+       /* Get to last ad on the new type */
+       for ( n_ad = &nat->sat_ad; *n_ad; n_ad = &(*n_ad)->ad_next ) ;
 
        for ( u_ad = &at->sat_ad; *u_ad; ) {
                struct berval   bv;
@@ -791,8 +795,9 @@ undef_remove(
 
                        *u_ad = (*u_ad)->ad_next;
 
-                       ch_free( tmp );
-
+                       tmp->ad_next = NULL;
+                       *n_ad = tmp;
+                       n_ad = &tmp->ad_next;
                } else {
                        u_ad = &(*u_ad)->ad_next;
                }
@@ -802,16 +807,17 @@ undef_remove(
 }
 
 int
-slap_ad_undef_remove(
-       char *name )
+slap_ad_undef_promote(
+       char *name,
+       AttributeType *at )
 {
        int     rc;
 
        ldap_pvt_thread_mutex_lock( &ad_undef_mutex );
 
-       rc = undef_remove( slap_schema.si_at_undefined, name );
+       rc = undef_promote( slap_schema.si_at_undefined, name, at );
        if ( rc == 0 ) {
-               rc = undef_remove( slap_schema.si_at_proxied, name );
+               rc = undef_promote( slap_schema.si_at_proxied, name, at );
        }
 
        ldap_pvt_thread_mutex_unlock( &ad_undef_mutex );
index 1b3b7b59919bd92354e7e6da0167e709b5c2a591..59bdb98142a23cf8882be565ef94941c41e9198a 100644 (file)
@@ -405,13 +405,13 @@ at_insert(
        }
 
        if ( sat->sat_oid ) {
-               slap_ad_undef_remove( sat->sat_oid );
+               slap_ad_undef_promote( sat->sat_oid, sat );
        }
 
        names = sat->sat_names;
        if ( names ) {
                while ( *names ) {
-                       slap_ad_undef_remove( *names );
+                       slap_ad_undef_promote( *names, sat );
                        names++;
                }
        }
index f901a6a379a3df4c5c3271defd7bf9ee2b328bac..5261751f7f93fdd61e07a22b2cb1d1ac3d011d7c 100644 (file)
@@ -168,8 +168,9 @@ LDAP_SLAPD_F (int) slap_bv2undef_ad LDAP_P((
        const char **text,
        unsigned proxied ));
 
-LDAP_SLAPD_F (int) slap_ad_undef_remove LDAP_P((
-       char *name ));
+LDAP_SLAPD_F (int) slap_ad_undef_promote LDAP_P((
+       char *name,
+       AttributeType *nat ));
 
 LDAP_SLAPD_F (AttributeDescription *) ad_find_tags LDAP_P((
        AttributeType *type,