]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/group.c
Import fix for ITS#31: slapd/ldbm/delete initialization bug
[openldap] / servers / slapd / back-ldbm / group.c
index 7def923a4dc5d48dace72223e1b2b9ac8e17572a..623aa2c95bcafa21f1c903151cfb8560ccbaa684 100644 (file)
@@ -20,6 +20,7 @@
 int
 ldbm_back_group(
        Backend     *be,
+       Entry   *target,
         char        *bdn,
         char        *edn,
         char        *objectclassValue,
@@ -28,6 +29,7 @@ ldbm_back_group(
 {
         struct ldbminfo *li = (struct ldbminfo *) be->be_private;    
         Entry        *e;
+               char            *tdn, *xdn; 
         char        *matched;
         Attribute   *objectClass;
         Attribute   *member;
@@ -38,14 +40,34 @@ ldbm_back_group(
        Debug( LDAP_DEBUG_TRACE, "=> ldbm_back_group: objectClass: %s attrName: %s\n", 
                 objectclassValue, groupattrName, 0 ); 
 
-        /* can we find bdn entry with reader lock */
-        if ((e = dn2entry_r(be, bdn, &matched )) == NULL) {
-                Debug( LDAP_DEBUG_TRACE, "=> ldbm_back_group: cannot find bdn: %s matched: %s\n", bdn, (matched ? matched : ""), 0 ); 
-                if (matched != NULL)
-                        free(matched);
-                return( 1 );
+       tdn = dn_normalize_case( ch_strdup( target->e_dn ) );
+       xdn = dn_normalize_case( ch_strdup( bdn ) );
+       Debug( LDAP_DEBUG_TRACE, "=> ldbm_back_group: tdn: %s\n", tdn, 0, 0 ); 
+       if (strcmp(tdn, xdn) == 0) {
+               /* we already have a LOCKED copy of the entry */
+               e = target;
+               Debug( LDAP_DEBUG_ARGS,
+                       "=> ldbm_back_group: target is bdn: %s\n",
+                       bdn, 0, 0 ); 
+       } else {
+               /* can we find bdn entry with reader lock */
+               if ((e = dn2entry_r(be, bdn, &matched )) == NULL) {
+                       Debug( LDAP_DEBUG_TRACE,
+                               "=> ldbm_back_group: cannot find bdn: %s matched: %s\n",
+                                       bdn, (matched ? matched : ""), 0 ); 
+                       if (matched != NULL)
+                               free(matched);
+                       free(tdn);
+                       free(xdn);
+                       return( 1 );
+               }
+               Debug( LDAP_DEBUG_ARGS,
+                       "=> ldbm_back_group: found bdn: %s\n",
+                       bdn, 0, 0 ); 
         }
-        Debug( LDAP_DEBUG_ARGS, "=> ldbm_back_group: found bdn: %s matched: %s\n", bdn, (matched ? matched : ""), 0 ); 
+       free(tdn);
+       free(xdn);
+
 
         /* check for deleted */
 
@@ -89,8 +111,10 @@ ldbm_back_group(
             }
         }
 
-        /* free entry and reader lock */
-        cache_return_entry_r( &li->li_cache, e );                 
+       if( target != e ) {
+               /* free entry and reader lock */
+               cache_return_entry_r( &li->li_cache, e );                 
+       }
         Debug( LDAP_DEBUG_ARGS, "ldbm_back_group: rc: %d\n", rc, 0, 0 ); 
         return(rc);
 }