]> git.kaiwu.me - njs.git/commitdiff
Fixed Buffer.concat() with subarrays.
authorSylvain Etienne <s.etienne@trusted-objects.com>
Tue, 18 Jan 2022 07:37:09 +0000 (08:37 +0100)
committerSylvain Etienne <s.etienne@trusted-objects.com>
Tue, 18 Jan 2022 07:37:09 +0000 (08:37 +0100)
This closes #458 issue on Github.

src/njs_buffer.c
src/test/njs_unit_test.c

index 1f52603b5aa91ba6acb05a4dad689f3b71c30fec..0473bcaf1d2c11ce41468b280ae38326171d28e0 100644 (file)
@@ -764,7 +764,7 @@ static njs_int_t
 njs_buffer_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
     njs_index_t unused)
 {
-    u_char             *p;
+    u_char             *p, *src;
     size_t             n;
     int64_t            i, len, list_len;
     njs_int_t          ret;
@@ -866,8 +866,9 @@ njs_buffer_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
         for (i = 0; len != 0 && i < list_len; i++) {
             arr = njs_typed_array(&array->start[i]);
             n = njs_min((size_t) len, arr->byte_length);
+            src = &njs_typed_array_buffer(arr)->u.u8[arr->offset];
 
-            p = njs_cpymem(p, njs_typed_array_buffer(arr)->u.u8, n);
+            p = njs_cpymem(p, src, n);
 
             len -= n;
         }
@@ -881,8 +882,9 @@ njs_buffer_concat(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
             arr = njs_typed_array(&retval);
             n = njs_min((size_t) len, arr->byte_length);
+            src = &njs_typed_array_buffer(arr)->u.u8[arr->offset];
 
-            p = njs_cpymem(p, njs_typed_array_buffer(arr)->u.u8, n);
+            p = njs_cpymem(p, src, n);
 
             len -= n;
         }
index f2792ef9f5b443a69614a27b8a5167d553968990..f332999ac0ac7f5856e7439af618f3b6d43d9be5 100644 (file)
@@ -20109,6 +20109,15 @@ static njs_unit_test_t  njs_buffer_module_test[] =
     { njs_str("Buffer.concat([new Uint8Array(2), new Uint8Array(1)], 6).fill('abc')"),
       njs_str("abcabc") },
 
+    { njs_str("Buffer.concat([Buffer.from('ABCD').slice(2,4), Buffer.from('ABCD').slice(0,2)])"),
+      njs_str("CDAB") },
+
+    { njs_str(njs_declare_sparse_array("list", 2)
+              "list[0] = Buffer.from('ABCD').slice(2,4);"
+              "list[1] = Buffer.from('ABCD').slice(0,2);"
+              "Buffer.concat(list);"),
+      njs_str("CDAB") },
+
     { njs_str(njs_declare_sparse_array("list", 2)
               "list[0] = new Uint8Array(2); list[1] = new Uint8Array(3);"
               "Buffer.concat(list).fill('ab');"),