]> git.kaiwu.me - njs.git/commitdiff
Fixed Fixed Buffer.prototype.write().
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 8 Aug 2024 05:48:04 +0000 (22:48 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Fri, 16 Aug 2024 01:35:03 +0000 (18:35 -0700)
src/njs_buffer.c

index fa087a19e47bd4e340d1327b4931c0e0ca506e0d..1ce98ef2e53107dcbb412be69c23b6e3da005d37 100644 (file)
@@ -1577,7 +1577,7 @@ encoding:
         return NJS_ERROR;
     }
 
-    if (offset >= array->byte_length) {
+    if (offset > array->byte_length) {
         njs_range_error(vm, "\"offset\" is out of range");
         return NJS_ERROR;
     }
@@ -1596,6 +1596,7 @@ njs_buffer_write_string(njs_vm_t *vm, njs_value_t *value,
     njs_int_t           ret;
     njs_str_t           str;
     njs_value_t         dst;
+    const u_char        *p, *end, *prev;
     njs_array_buffer_t  *buffer;
 
     buffer = njs_typed_array_buffer(array);
@@ -1618,6 +1619,23 @@ njs_buffer_write_string(njs_vm_t *vm, njs_value_t *value,
         goto done;
     }
 
+    length = njs_min(str.length, (size_t) length);
+
+    if (encoding->decode == njs_string_decode_utf8) {
+        /* Avoid writing incomplete UTF-8 characters. */
+        p = prev = str.start;
+        end = p + length;
+
+        while (p < end) {
+            p = njs_utf8_next(p, str.start + str.length);
+            if (p <= end) {
+                prev = p;
+            }
+        }
+
+        length = prev - str.start;
+    }
+
     memcpy(start, str.start, length);
 
 done: