]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-meta/search.c
fix ITS#4071
[openldap] / servers / slapd / back-meta / search.c
index f1521b9b92ee502c0d60f7490c4825857a2563d9..544bf6e31f5f2c0a9ebe69d01b505cebadf15221 100644 (file)
@@ -244,8 +244,9 @@ meta_back_search( Operation *op, SlapReply *rs )
        LDAPMessage     *res = NULL, *e;
        int             rc = 0, sres = LDAP_SUCCESS;
        char            *matched = NULL;
-       int             i, last = 0, ncandidates = 0,
+       int             last = 0, ncandidates = 0,
                        initial_candidates = 0, candidate_match = 0;
+       long            i;
        dncookie        dc;
        int             is_ok = 0;
        void            *savepriv;
@@ -357,7 +358,6 @@ meta_back_search( Operation *op, SlapReply *rs )
 
        if ( op->ors_tlimit != SLAP_NO_LIMIT ) {
                stoptime = op->o_time + op->ors_tlimit;
-               tv.tv_sec = 0;
        }
 
        /*
@@ -630,11 +630,11 @@ really_bad:;
                                sres = slap_map_api2result( rs );
 
                                snprintf( buf, sizeof( buf ),
-                                       "%s meta_back_search[%d] "
-                                       "match=\"%s\" err=%d\n",
+                                       "%s meta_back_search[%ld] "
+                                       "match=\"%s\" err=%ld\n",
                                        op->o_log_prefix, i,
                                        candidates[ i ].sr_matched ? candidates[ i ].sr_matched : "",
-                                       candidates[ i ].sr_err );
+                                       (long) candidates[ i ].sr_err );
                                Debug( LDAP_DEBUG_ANY, "%s", buf, 0, 0 );
 
                                switch ( sres ) {
@@ -702,8 +702,7 @@ really_bad:;
                }
 
                if ( gotit == 0 ) {
-                       tv.tv_sec = 0;
-                        tv.tv_usec = 100000;   /* 0.1 s */
+                       LDAP_BACK_TV_SET( &tv );
                         ldap_pvt_thread_yield();
 
                } else {
@@ -726,7 +725,7 @@ really_bad:;
         * FIXME: only the last one gets caught!
         */
        savepriv = op->o_private;
-       op->o_private = (void *)mi->mi_ntargets;
+       op->o_private = (void *)(long)mi->mi_ntargets;
        if ( candidate_match > 0 ) {
                struct berval   pmatched = BER_BVNULL;
 
@@ -1054,11 +1053,28 @@ meta_send_entry(
                                                &attr->a_vals[i] );
                                }
 
+                               if ( rc ) {
+                                       LBER_FREE( attr->a_vals[i].bv_val );
+                                       if ( --last == i ) {
+                                               BER_BVZERO( &attr->a_vals[ i ] );
+                                               break;
+                                       }
+                                       attr->a_vals[i] = attr->a_vals[last];
+                                       BER_BVZERO( &attr->a_vals[last] );
+                                       i--;
+                                       continue;
+                               }
+
                                if ( pretty ) {
                                        LBER_FREE( attr->a_vals[i].bv_val );
                                        attr->a_vals[i] = pval;
                                }
                        }
+
+                       if ( last == 0 && attr->a_vals != &slap_dummy_bv ) {
+                               attr_free( attr );
+                               goto next_attr;
+                       }
                }
 
                if ( last && attr->a_desc->ad_type->sat_equality &&