Author: abartlet
Date: 2007-12-17 06:02:54 +0000 (Mon, 17 Dec 2007)
New Revision: 26489

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

Log:
Merge fixed ranged results module to release branch. 

This is the last blocker for the release that I know of.

Andrew Bartlett

Modified:
   branches/SAMBA_4_0_RELEASE/source/dsdb/samdb/ldb_modules/ranged_results.c


Changeset:
Modified: 
branches/SAMBA_4_0_RELEASE/source/dsdb/samdb/ldb_modules/ranged_results.c
===================================================================
--- branches/SAMBA_4_0_RELEASE/source/dsdb/samdb/ldb_modules/ranged_results.c   
2007-12-17 05:56:42 UTC (rev 26488)
+++ branches/SAMBA_4_0_RELEASE/source/dsdb/samdb/ldb_modules/ranged_results.c   
2007-12-17 06:02:54 UTC (rev 26489)
@@ -60,9 +60,10 @@
                if (strncasecmp(p, ";range=", strlen(";range=")) != 0) {
                        continue;
                }
-               if (sscanf(p, ";range=%u-*", &start) == 1) {
+               if (sscanf(p, ";range=%u-%u", &start, &end) == 2) {
+               } else if (sscanf(p, ";range=%u-*", &start) == 1) {
                        end = (unsigned int)-1;
-               } else if (sscanf(p, ";range=%u-%u", &start, &end) != 2) {
+               } else {
                        continue;
                }
                new_attr = talloc_strndup(orig_req, 
@@ -82,39 +83,44 @@
                        ldb_asprintf_errstring(ldb, "range request error: start 
must not be greater than end");
                        return LDB_ERR_UNWILLING_TO_PERFORM;
                }
-               if (end >= el->num_values) {
+               if (end >= (el->num_values - 1)) {
                        /* Need to leave the requested attribute in
                         * there (so add an empty one to match) */
                        end_str = "*";
-                       end = el->num_values;
-                       ret = ldb_msg_add_empty(ares->message, 
orig_req->op.search.attrs[i], 
-                                              0, NULL);
-                       if (ret != LDB_SUCCESS) {
-                               return ret;
-                       }
+                       end = el->num_values - 1;
                } else {
                        end_str = talloc_asprintf(el, "%u", end);
+                       if (!end_str) {
+                               ldb_oom(ldb);
+                               return LDB_ERR_OPERATIONS_ERROR;
+                       }
                }
-               orig_values = el->values;
-               orig_num_values = el->num_values;
-
-               if ((start + end < start) || (start + end < end)) {
-                       ldb_asprintf_errstring(ldb, "range request error: start 
or end would overflow!");
-                       return LDB_ERR_UNWILLING_TO_PERFORM;
+               /* If start is greater then where we noe find the end to be */
+               if (start > end) {
+                       el->num_values = 0;
+                       el->values = NULL;
+               } else {
+                       orig_values = el->values;
+                       orig_num_values = el->num_values;
+                       
+                       if ((start + end < start) || (start + end < end)) {
+                               ldb_asprintf_errstring(ldb, "range request 
error: start or end would overflow!");
+                               return LDB_ERR_UNWILLING_TO_PERFORM;
+                       }
+                       
+                       el->num_values = 0;
+                       
+                       el->values = talloc_array(el, struct ldb_val, (end - 
start) + 1);
+                       if (!el->values) {
+                               ldb_oom(ldb);
+                               return LDB_ERR_OPERATIONS_ERROR;
+                       }
+                       for (j=start; j <= end; j++) {
+                               el->values[el->num_values] = orig_values[j];
+                               el->num_values++;
+                       }
                }
-
-               el->values = talloc_array(el, struct ldb_val, end - start);
-               el->num_values = 0;
-
-               if (!el->values) {
-                       ldb_oom(ldb);
-                       return LDB_ERR_OPERATIONS_ERROR;
-               }
-               for (j=start; j < end; j++) {
-                       el->values[el->num_values] = orig_values[j];
-                       el->num_values++;
-               }
-               el->name = talloc_asprintf(el, "%s;Range=%u-%s", el->name, 
start, end_str);
+               el->name = talloc_asprintf(el, "%s;range=%u-%s", el->name, 
start, end_str);
                if (!el->name) {
                        ldb_oom(ldb);
                        return LDB_ERR_OPERATIONS_ERROR;

Reply via email to