]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/modrdn.c
Import resetting of c_dn/c_cdn after anonymous bind.
[openldap] / servers / slapd / back-ldbm / modrdn.c
index ea8b2c4fba2084c403c180ddedd7d03dd4874c58..33f6536bdc7b01be884e021d8e92fcfb396d56ee 100644 (file)
@@ -23,7 +23,8 @@ ldbm_back_modrdn(
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        char            *matched = NULL;
-       char            *pdn = NULL, *newdn = NULL;
+       char            *p_dn = NULL, *p_ndn = NULL;
+       char            *new_dn = NULL, *new_ndn = NULL;
        char            sep[2];
        Entry           *e, *p = NULL;
        int                     rootlock = 0;
@@ -40,8 +41,8 @@ ldbm_back_modrdn(
 
 #ifdef SLAPD_CHILD_MODIFICATION_WITH_ENTRY_ACL
                /* check parent for "children" acl */
-       if ( ! access_allowed( be, conn, op, e, "entry", NULL,
-               op->o_dn, ACL_WRITE ) )
+       if ( ! access_allowed( be, conn, op, e,
+               "entry", NULL, ACL_WRITE ) )
        {
                Debug( LDAP_DEBUG_TRACE, "no access to entry\n", 0,
                        0, 0 );
@@ -51,9 +52,9 @@ ldbm_back_modrdn(
        }
 #endif
 
-       if ( (pdn = dn_parent( be, dn )) != NULL ) {
+       if ( (p_ndn = dn_parent( be, e->e_ndn )) != NULL ) {
                /* parent + rdn + separator(s) + null */
-               if( (p = dn2entry_w( be, pdn, &matched )) == NULL) {
+               if( (p = dn2entry_w( be, p_ndn, &matched )) == NULL) {
                        Debug( LDAP_DEBUG_TRACE, "parent does not exist\n",
                                0, 0, 0);
                        send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR,
@@ -63,8 +64,8 @@ ldbm_back_modrdn(
 
 #ifndef SLAPD_CHILD_MODIFICATION_WITH_ENTRY_ACL
                /* check parent for "children" acl */
-               if ( ! access_allowed( be, conn, op, p, "children", NULL,
-                       op->o_dn, ACL_WRITE ) )
+               if ( ! access_allowed( be, conn, op, p,
+                       "children", NULL, ACL_WRITE ) )
                {
                        Debug( LDAP_DEBUG_TRACE, "no access to parent\n", 0,
                                0, 0 );
@@ -74,29 +75,31 @@ ldbm_back_modrdn(
                }
 #endif
 
-               newdn = (char *) ch_malloc( strlen( pdn ) + strlen( newrdn )
+               p_dn = dn_parent( be, e->e_dn );
+               new_dn = (char *) ch_malloc( strlen( p_dn ) + strlen( newrdn )
                    + 3 );
-               if ( dn_type( dn ) == DN_X500 ) {
-                       strcpy( newdn, newrdn );
-                       strcat( newdn, ", " );
-                       strcat( newdn, pdn );
+               if ( dn_type( e->e_dn ) == DN_X500 ) {
+                       strcpy( new_dn, newrdn );
+                       strcat( new_dn, ", " );
+                       strcat( new_dn, p_dn );
                } else {
                        char *s;
-                       strcpy( newdn, newrdn );
+                       strcpy( new_dn, newrdn );
                        s = strchr( newrdn, '\0' );
                        s--;
                        if ( *s != '.' && *s != '@' ) {
                                if ( (s = strpbrk( dn, ".@" )) != NULL ) {
                                        sep[0] = *s;
                                        sep[1] = '\0';
-                                       strcat( newdn, sep );
+                                       strcat( new_dn, sep );
                                }
                        }
-                       strcat( newdn, pdn );
+                       strcat( new_dn, p_dn );
                }
+
        } else {
                /* no parent, modrdn entry directly under root */
-               if( ! be_isroot( be, op->o_dn ) ) {
+               if( ! be_isroot( be, op->o_ndn ) ) {
                        Debug( LDAP_DEBUG_TRACE, "no parent & not root\n",
                                0, 0, 0);
                        send_ldap_result( conn, op, LDAP_INSUFFICIENT_ACCESS,
@@ -107,12 +110,12 @@ ldbm_back_modrdn(
                pthread_mutex_lock(&li->li_root_mutex);
                rootlock = 1;
 
-               newdn = ch_strdup( newrdn );
+               new_dn = ch_strdup( newrdn );
        }
 
-       (void) dn_normalize( newdn );
+       new_ndn = dn_normalize_case( ch_strdup( new_dn ) );
 
-       if ( (dn2id ( be, newdn ) ) != NOID ) {
+       if ( (dn2id ( be, new_ndn ) ) != NOID ) {
                send_ldap_result( conn, op, LDAP_ALREADY_EXISTS, NULL, NULL );
                goto return_results;
        }
@@ -126,20 +129,22 @@ ldbm_back_modrdn(
        pthread_mutex_unlock( &op->o_abandonmutex );
 
        /* add new one */
-       if ( dn2id_add( be, newdn, e->e_id ) != 0 ) {
+       if ( dn2id_add( be, new_ndn, e->e_id ) != 0 ) {
                send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL, NULL );
                goto return_results;
        }
 
        /* delete old one */
-       if ( dn2id_delete( be, dn ) != 0 ) {
+       if ( dn2id_delete( be, e->e_ndn ) != 0 ) {
                send_ldap_result( conn, op, LDAP_OPERATIONS_ERROR, NULL, NULL );
                goto return_results;
        }
 
        (void) cache_delete_entry( &li->li_cache, e );
        free( e->e_dn );
-       e->e_dn = newdn;
+       free( e->e_ndn );
+       e->e_dn = new_dn;
+       e->e_ndn = new_ndn;
 
        /* XXX
         * At some point here we need to update the attribute values in
@@ -161,15 +166,19 @@ ldbm_back_modrdn(
        rc = 0;
 
 return_results:
-       if( newdn != NULL ) free( newdn );
-       if( pdn != NULL ) free( pdn );
+       if( new_dn != NULL ) free( new_dn );
+       if( new_ndn != NULL ) free( new_ndn );
+       if( p_dn != NULL ) free( p_dn );
+       if( p_ndn != NULL ) free( p_ndn );
+
        if( matched != NULL ) free( matched );
 
        if( p != NULL ) {
                /* free parent and writer lock */
                cache_return_entry_w( &li->li_cache, p );
+       }
 
-       } else if ( rootlock ) {
+       if ( rootlock ) {
                /* release root writer lock */
                pthread_mutex_unlock(&li->li_root_mutex);
        }