Author: abartlet
Date: 2007-09-18 06:36:07 +0000 (Tue, 18 Sep 2007)
New Revision: 25204

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=25204

Log:
Patch by Andrew Kroeger <[EMAIL PROTECTED]> fixing bug #4958 -
rename of ldb entries for a case change (only).

I've modified the testsuite to verify this.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
   branches/SAMBA_4_0/testprogs/ejs/ldb.js


Changeset:
Modified: branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c
===================================================================
--- branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c 2007-09-18 02:43:56 UTC 
(rev 25203)
+++ branches/SAMBA_4_0/source/lib/ldb/ldb_tdb/ldb_tdb.c 2007-09-18 06:36:07 UTC 
(rev 25204)
@@ -856,16 +856,38 @@
                goto done;
        }
 
-       ret = ltdb_add_internal(module, msg);
-       if (ret != LDB_SUCCESS) {
-               goto done;
-       }
+       if (ldb_dn_compare(req->op.rename.olddn, req->op.rename.newdn) == 0) {
+               /* The rename operation is apparently only changing case -
+                  the DNs are the same.  Delete the old DN before adding
+                  the new one to avoid a TDB_ERR_EXISTS error.
 
-       tret = ltdb_delete_internal(module, req->op.rename.olddn);
-       if (tret != LDB_SUCCESS) {
-               ltdb_delete_internal(module, req->op.rename.newdn);
-               ret = LDB_ERR_OPERATIONS_ERROR;
-               goto done;
+                  The only drawback to this is that if the delete
+                  succeeds but the add fails, we rely on the
+                  transaction to roll this all back. */
+               ret = ltdb_delete_internal(module, req->op.rename.olddn);
+               if (ret != LDB_SUCCESS) {
+                       goto done;
+               }
+
+               ret = ltdb_add_internal(module, msg);
+               if (ret != LDB_SUCCESS) {
+                       goto done;
+               }
+       } else {
+               /* The rename operation is changing DNs.  Try to add the new
+                  DN first to avoid clobbering another DN not related to
+                  this rename operation. */
+               ret = ltdb_add_internal(module, msg);
+               if (ret != LDB_SUCCESS) {
+                       goto done;
+               }
+
+               tret = ltdb_delete_internal(module, req->op.rename.olddn);
+               if (tret != LDB_SUCCESS) {
+                       ltdb_delete_internal(module, req->op.rename.newdn);
+                       ret = LDB_ERR_OPERATIONS_ERROR;
+                       goto done;
+               }
        }
 
        if (ltdb_ac->callback) {

Modified: branches/SAMBA_4_0/testprogs/ejs/ldb.js
===================================================================
--- branches/SAMBA_4_0/testprogs/ejs/ldb.js     2007-09-18 02:43:56 UTC (rev 
25203)
+++ branches/SAMBA_4_0/testprogs/ejs/ldb.js     2007-09-18 06:36:07 UTC (rev 
25204)
@@ -60,6 +60,11 @@
        res = ldb.search("x=4", NULL, ldb.SCOPE_DEFAULT, attrs);
        assert(res.msgs[0].dn == "cn=x3,cn=test");
 
+       ok = ldb.rename("cn=x3,cn=test", "cn=X3,cn=test");
+       assert(ok.error == 0);
+       res = ldb.search("x=4", NULL, ldb.SCOPE_DEFAULT, attrs);
+       assert(res.msgs[0].dn == "cn=X3,cn=test");
+
        ok = ldb.modify("
 dn: cn=x3,cn=test
 changetype: modify

Reply via email to