]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/sssvlv.c
fix LDIF comment when modifying (ITS#6286)
[openldap] / servers / slapd / overlays / sssvlv.c
index 7f16ac7cf3df417e660076ad4765c746707e7ec6..8dccdab02c78ef2a5412edbf49c85946e75416d4 100644 (file)
@@ -34,6 +34,8 @@
 #include "lutil.h"
 #include "config.h"
 
+#include "../../../libraries/liblber/lber-int.h"       /* ber_rewind */
+
 /* RFC2891: Server Side Sorting
  * RFC2696: Paged Results
  */
@@ -76,7 +78,7 @@ typedef struct sort_key
 
 typedef struct sort_ctrl {
        int sc_nkeys;
-       sort_key sc_keys[0];
+       sort_key sc_keys[1];
 } sort_ctrl;
 
 
@@ -339,7 +341,7 @@ static void free_sort_op( Connection *conn, sort_op *so )
        ch_free( so );
 }
 
-static int send_list(
+static void send_list(
        Operation               *op,
        SlapReply               *rs,
        sort_op                 *so)
@@ -427,7 +429,10 @@ range_err:
                for (i=1; i<sc->sc_nkeys; i++) {
                        BER_BVZERO( &sn->sn_vals[i] );
                }
-               cur_node = tavl_find2( so->so_tree, sn, node_cmp );
+               cur_node = tavl_find3( so->so_tree, sn, node_cmp, &j );
+               /* didn't find >= match */
+               if ( j > 0 )
+                       cur_node = NULL;
                op->o_tmpfree( sn, op->o_tmpmemctx );
 
                if ( !cur_node ) {
@@ -533,6 +538,9 @@ static void send_entry(
                "%s: response control: status=%d, text=%s\n",
                debug_header, rs->sr_err, SAFESTR(rs->sr_text, "<None>"));
 
+       if ( !so->so_tree )
+               return;
+
        /* RFC 2891: If critical then send the entries iff they were
         * succesfully sorted.  If non-critical send all entries
         * whether they were sorted or not.
@@ -808,8 +816,11 @@ static int sssvlv_op_search(
                        } else {
                                so->so_paged = 0;
                                so->so_page_size = 0;
-                               if ( vc )
+                               if ( vc ) {
                                        so->so_vlv = op->o_ctrlflag[vlv_cid];
+                                       so->so_vlv_target = 0;
+                                       so->so_vlv_rc = 0;
+                               }
                        }
                        so->so_vcontext = (unsigned long)so;
                        so->so_nentries = 0;
@@ -991,7 +1002,7 @@ static int sss_parseCtrl(
        i = count_key( ber );
 
        sc = op->o_tmpalloc( sizeof(sort_ctrl) +
-               i * sizeof(sort_key), op->o_tmpmemctx );
+               (i-1) * sizeof(sort_key), op->o_tmpmemctx );
        sc->sc_nkeys = i;
        op->o_controls[sss_cid] = sc;
 
@@ -1095,12 +1106,13 @@ static int sssvlv_db_open(
 {
        slap_overinst   *on = (slap_overinst *)be->bd_info;
        sssvlv_info *si = on->on_bi.bi_private;
+       int rc;
 
        /* If not set, default to 1/2 of available threads */
        if ( !si->svi_max )
                si->svi_max = connection_pool_max / 2;
 
-       int rc = overlay_register_control( be, LDAP_CONTROL_SORTREQUEST );
+       rc = overlay_register_control( be, LDAP_CONTROL_SORTREQUEST );
        if ( rc == LDAP_SUCCESS )
                rc = overlay_register_control( be, LDAP_CONTROL_VLVREQUEST );
        return rc;