]> granicus.if.org Git - jq/commitdiff
Array slice overflows (fix #1108)
authorNicolas Williams <nico@cryptonector.com>
Wed, 1 Mar 2017 23:35:08 +0000 (17:35 -0600)
committerNicolas Williams <nico@cryptonector.com>
Wed, 1 Mar 2017 23:48:45 +0000 (17:48 -0600)
src/jv.c
tests/jq.test

index 5e54d2f3d2a4f739f5333cfb347edfe50a8a7282..c2448a7c401b19e27600c45ec7188a0a3b2c947a 100644 (file)
--- a/src/jv.c
+++ b/src/jv.c
@@ -296,10 +296,18 @@ static jv jvp_array_slice(jv a, int start, int end) {
     jv_free(a);
     return jv_array();
   }
-  // FIXME FIXME FIXME large offsets
-  a.offset += start;
-  a.size = end - start;
-  return a;
+
+  if (a.offset + start > 1 << (sizeof(a.offset) * CHAR_BIT)) {
+    jv r = jv_array_sized(end - start);
+    for (int i = start; i < end; i++)
+      r = jv_array_append(r, jv_array_get(jv_copy(a), i));
+    jv_free(a);
+    return r;
+  } else {
+    a.offset += start;
+    a.size = end - start;
+    return a;
+  }
 }
 
 /*
index 4dad230831bd13000200fdb30aa52645f213b1c6..930bf79445604e489ad7dbc3d8b7d966766e78b0 100644 (file)
@@ -383,6 +383,15 @@ del(.[2:4],.[0],.[-2:])
 [0,1,"a","b",4,5,6,7]
 [0,1,"a","b","c",4,5,6,7]
 
+# Slices at large offsets (issue #1108)
+#
+# This is written this way because [range(<large number>)] is
+# significantly slower under valgrind than .[<large number>] = value.
+#
+# We range down rather than up so that we have just one realloc.
+reduce range(70010;69999;-1) as $i ([]; .[$i] = $i)|.[69999:70003]
+null
+[null,70000,70001,70002]
 
 #
 # Variables