Index: servers/slapd/modrdn.c
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/servers/slapd/modrdn.c,v
retrieving revision 1.177
diff -u -2 -r1.177 modrdn.c
--- servers/slapd/modrdn.c 7 Jan 2008 23:20:08 -0000 1.177
+++ servers/slapd/modrdn.c 30 Jan 2008 10:19:51 -0000
@@ -215,7 +215,7 @@
fe_op_modrdn( Operation *op, SlapReply *rs )
{
- Backend *newSuperior_be = NULL;
- struct berval pdn = BER_BVNULL;
+ struct berval dest_ndn = BER_BVNULL, dest_pndn, pdn = BER_BVNULL;
BackendDB *op_be, *bd = op->o_bd;
+ ber_slen_t diff;
if( op->o_req_ndn.bv_len == 0 ) {
@@ -235,4 +235,21 @@
}
+ if( op->orr_nnewSup ) {
+ dest_pndn = *op->orr_nnewSup;
+ } else {
+ dnParent( &op->o_req_ndn, &dest_pndn );
+ }
+ build_new_dn( &dest_ndn, &dest_pndn, &op->orr_nnewrdn, op->o_tmpmemctx );
+
+ diff = (ber_slen_t) dest_ndn.bv_len - (ber_slen_t) op->o_req_ndn.bv_len;
+ if ( diff > 0 ? dnIsSuffix( &dest_ndn, &op->o_req_ndn )
+ : diff < 0 && dnIsSuffix( &op->o_req_ndn, &dest_ndn ) )
+ {
+ send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
+ diff > 0 ? "cannot place an entry below itself"
+ : "cannot place an entry above itself" );
+ goto cleanup;
+ }
+
/*
* We could be serving multiple database backends. Select the
@@ -276,17 +293,9 @@
}
- /* Make sure that the entry being changed and the newSuperior are in
- * the same backend, otherwise we return an error.
- */
- if( op->orr_newSup ) {
- newSuperior_be = select_backend( op->orr_nnewSup, 0 );
-
- if ( newSuperior_be != op->o_bd ) {
- /* newSuperior is in different backend */
+ /* check that destination DN is in the same backend as source DN */
+ if ( select_backend( &dest_ndn, 0 ) != op->o_bd ) {
send_ldap_error( op, rs, LDAP_AFFECTS_MULTIPLE_DSAS,
"cannot rename between DSAs" );
-
goto cleanup;
- }
}
@@ -368,4 +377,6 @@
cleanup:;
+ if ( dest_ndn.bv_val != NULL )
+ ber_memfree_x( dest_ndn.bv_val, op->o_tmpmemctx );
op->o_bd = bd;
return rs->sr_err;
Index: tests/scripts/defines.sh
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/tests/scripts/defines.sh,v
retrieving revision 1.161
diff -u -2 -r1.161 defines.sh
--- tests/scripts/defines.sh 7 Jan 2008 23:20:16 -0000 1.161
+++ tests/scripts/defines.sh 30 Jan 2008 10:30:27 -0000
@@ -78,4 +78,5 @@
CONF=$DATADIR/slapd.conf
CONFTWO=$DATADIR/slapd2.conf
+CONF2DB=$DATADIR/slapd-2db.conf
MCONF=$DATADIR/slapd-master.conf
COMPCONF=$DATADIR/slapd-component.conf
Index: tests/scripts/test005-modrdn
===================================================================
RCS file: /repo/OpenLDAP/pkg/ldap/tests/scripts/test005-modrdn,v
retrieving revision 1.53
diff -u -2 -r1.53 test005-modrdn
--- tests/scripts/test005-modrdn 11 Jan 2008 02:17:37 -0000 1.53
+++ tests/scripts/test005-modrdn 30 Jan 2008 10:30:27 -0000
@@ -17,9 +17,9 @@
. $SRCDIR/scripts/defines.sh
-mkdir -p $TESTDIR $DBDIR1
+mkdir -p $TESTDIR $DBDIR1A $DBDIR1B
echo "Running slapadd to build slapd database..."
-. $CONFFILTER $BACKEND $MONITORDB < $CONF > $CONF1
-$SLAPADD -f $CONF1 -l $LDIFORDERED
+. $CONFFILTER $BACKEND $MONITORDB < $CONF2DB > $CONF1
+$SLAPADD -f $CONF1 -b "$BASEDN" -l $LDIFORDERED
RC=$?
if test $RC != 0 ; then
@@ -222,7 +222,26 @@
fi
-echo "Testing modrdn with newSuperior as child of target "
+echo "Testing modrdn to another database (should fail with affectsMultipleDSAs)"
$LDAPMODRDN -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD > \
- $TESTOUT 2>&1 -s 'cn=Sub1, ou=FooBar, cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com' \
+ $TESTOUT 2>&1 'cn=All Staff,ou=Groups,dc=example,dc=com' 'cn=Everyone'
+RC=$?
+case $RC in
+0)
+ echo "ldapmodrdn succeeded, should have failed!"
+ test $KILLSERVERS != no && kill -HUP $KILLPIDS
+ exit -1
+ ;;
+71)
+ ;;
+*)
+ echo "ldapmodrdn failed ($RC)!"
+ test $KILLSERVERS != no && kill -HUP $KILLPIDS
+ exit $RC
+ ;;
+esac
+
+echo "Testing modrdn with newSuperior = target (should fail with unwillingToPerform)"
+$LDAPMODRDN -D "$MANAGERDN" -h $LOCALHOST -p $PORT1 -w $PASSWD > \
+ $TESTOUT 2>&1 -s 'cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com' \
'cn=James A Jones 1, ou=Alumni Association, ou=People, dc=example, dc=com' 'cn=James A Jones 1'
@@ -234,6 +253,5 @@
exit -1
;;
-32)
- echo "ldapmodrdn failed (noSuchObject)"
+53)
;;
*)
--- /dev/null 2007-10-16 01:18:54 +0200
+++ tests/data/slapd-2db.conf 2008-01-23 01:54:50 +0100
@@ -0,0 +1,52 @@
+# stand-alone slapd config -- for testing (with indexing)
+# $OpenLDAP$
+## This work is part of OpenLDAP Software .
+##
+## Copyright 1998-2008 The OpenLDAP Foundation.
+## All rights reserved.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted only as authorized by the OpenLDAP
+## Public License.
+##
+## A copy of this license is available in the file LICENSE in the
+## top-level directory of the distribution or, alternatively, at
+## .
+
+include @SCHEMADIR@/core.schema
+include @SCHEMADIR@/cosine.schema
+include @SCHEMADIR@/inetorgperson.schema
+include @SCHEMADIR@/openldap.schema
+#
+pidfile @TESTDIR@/slapd.1.pid
+argsfile @TESTDIR@/slapd.1.args
+
+#mod#modulepath ../servers/slapd/back-@BACKEND@/
+#mod#moduleload back_@BACKEND@.la
+#monitormod#modulepath ../servers/slapd/back-monitor/
+#monitormod#moduleload back_monitor.la
+
+#######################################################################
+# database definitions
+#######################################################################
+
+database @BACKEND@
+suffix "cn=Everyone,ou=Groups,dc=example,dc=com"
+directory @TESTDIR@/db.1.a
+subordinate
+#bdb#index objectClass eq
+#bdb#index cn,sn,uid pres,eq,sub
+#hdb#index objectClass eq
+#hdb#index cn,sn,uid pres,eq,sub
+
+database @BACKEND@
+suffix "dc=example,dc=com"
+directory @TESTDIR@/db.1.b
+rootdn "cn=Manager,dc=example,dc=com"
+rootpw secret
+#bdb#index objectClass eq
+#bdb#index cn,sn,uid pres,eq,sub
+#hdb#index objectClass eq
+#hdb#index cn,sn,uid pres,eq,sub
+
+#monitor#database monitor