]> git.sur5r.net Git - openldap/commitdiff
fix matched handling of slapd-ldap/slapo-chain (ITS#4176)
authorPierangelo Masarati <ando@openldap.org>
Wed, 16 Nov 2005 14:17:19 +0000 (14:17 +0000)
committerPierangelo Masarati <ando@openldap.org>
Wed, 16 Nov 2005 14:17:19 +0000 (14:17 +0000)
servers/slapd/back-ldap/chain.c
servers/slapd/back-ldap/search.c
tests/scripts/test032-chain

index a0dbb581c23ab34e9729ba65529abcf6ab278d2d..3a582883c3a135fb543c229fda116894f4387269 100644 (file)
@@ -368,6 +368,7 @@ ldap_chain_response( Operation *op, SlapReply *rs )
                        sc2 = { 0 };
        int             rc = 0;
        int             cache = op->o_do_not_cache;
+       char            *matched;
        BerVarray       ref;
        struct berval   ndn = op->o_ndn;
 
@@ -423,6 +424,8 @@ ldap_chain_response( Operation *op, SlapReply *rs )
         *   e) what ssf
         */
 
+       matched = rs->sr_matched;
+       rs->sr_matched = NULL;
        ref = rs->sr_ref;
        rs->sr_ref = NULL;
 
@@ -626,6 +629,7 @@ dont_chain:;
        op->o_bd->be_private = private;
        op->o_callback = sc;
        op->o_ndn = ndn;
+       rs->sr_matched = matched;
        rs->sr_ref = ref;
 
        ldap_pvt_thread_mutex_unlock( &lc->lc_mutex );
index 9c880bc552201d9a5327ee336e2ca170668fcefd..5c824d0b0c9b5adf59352ba8fc4bc7d907a020eb 100644 (file)
@@ -155,6 +155,7 @@ ldap_back_search(
        int             freetext = 0;
        int             do_retry = 1;
        LDAPControl     **ctrls = NULL;
+       char            *save_matched = rs->sr_matched;
 
        lc = ldap_back_getconn( op, rs, LDAP_BACK_SENDERR );
        if ( !lc || !ldap_back_dobind( lc, op, rs, LDAP_BACK_SENDERR ) ) {
@@ -454,14 +455,14 @@ finish:;
                rs->sr_ctrls = NULL;
        }
 
-       if ( rs->sr_matched != NULL ) {
+       if ( rs->sr_matched != NULL && rs->sr_matched != save_matched ) {
                if ( rs->sr_matched != match.bv_val ) {
                        ber_memfree_x( (char *)rs->sr_matched, op->o_tmpmemctx );
 
                } else {
                        LDAP_FREE( match.bv_val );
                }
-               rs->sr_matched = NULL;
+               rs->sr_matched = save_matched;
        }
 
        if ( !BER_BVISNULL( &filter ) && filter.bv_val != op->ors_filterstr.bv_val ) {
index 5b6a1db01b16fb8323bc5f838abc015b82686862..cec27d7016a072134298646f230c0c829b99d951 100755 (executable)
@@ -21,6 +21,8 @@ if test $BACKLDAP = "ldapno" ; then
        exit 0
 fi 
 
+rm -rf $TESTDIR
+
 mkdir -p $TESTDIR $DBDIR1 $DBDIR2
 
 echo "Running slapadd to build slapd database..."
@@ -50,6 +52,7 @@ if test $WAIT != 0 ; then
     echo PID $PID1
     read foo
 fi
+KILLPIDS="$PID1"
 
 echo "Starting second slapd on TCP/IP port $PORT2..."
 . $CONFFILTER $BACKEND $MONITORDB < $CHAINCONF2 > $CONF2
@@ -60,7 +63,7 @@ if test $WAIT != 0 ; then
     read foo
 fi
 
-KILLPIDS="$PID1 $PID2"
+KILLPIDS="$KILLPIDS $PID2"
 
 sleep 1
 
@@ -76,6 +79,12 @@ for i in 0 1 2 3 4 5; do
        sleep 5
 done
 
+if test $RC != 0 ; then
+       echo "ldapsearch failed ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+       exit $RC
+fi
+
 echo "Using ldapsearch to check that second slapd is running..."
 for i in 0 1 2 3 4 5; do
        $LDAPSEARCH -s base -b "$MONITOR" -h $LOCALHOST -p $PORT2 \
@@ -88,6 +97,12 @@ for i in 0 1 2 3 4 5; do
        sleep 5
 done
 
+if test $RC != 0 ; then
+       echo "ldapsearch failed ($RC)!"
+       test $KILLSERVERS != no && kill -HUP $KILLPIDS
+       exit $RC
+fi
+
 for P in $PORT1 $PORT2 ; do
        echo "Testing ldapsearch as anonymous for \"$BASEDN\" on port $P..."
        $LDAPSEARCH -h $LOCALHOST -p $P -b "$BASEDN" -S "" \