]> git.kaiwu.me - njs.git/commitdiff
Fixed njs_string_truncate() function for non-byte strings.
authorAlexander Borisov <alexander.borisov@nginx.com>
Wed, 22 Jul 2020 12:21:13 +0000 (15:21 +0300)
committerAlexander Borisov <alexander.borisov@nginx.com>
Wed, 22 Jul 2020 12:21:13 +0000 (15:21 +0300)
src/njs_fs.c
src/njs_string.c
src/njs_string.h

index 4f7f0519af230ea0c1f38f429bda3f40d059384f..fad0678b0d3f47ef5e838830877ae458247fe166 100644 (file)
@@ -262,7 +262,7 @@ njs_fs_read_file(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs,
 
         if (njs_slow_path(data.length < size)) {
             /* Pseudo-files may return less data than declared by st_size. */
-            njs_string_truncate(&retval, data.length);
+            njs_string_truncate(&retval, data.length, length);
         }
 
         size = data.length;
index 9aa24a26faa51b5aae2743a85e5a44e2cfe84223..6207288a5448d5da784c58a70d490ca4146b0161 100644 (file)
@@ -172,30 +172,33 @@ njs_string_alloc(njs_vm_t *vm, njs_value_t *value, uint64_t size,
 
 
 void
-njs_string_truncate(njs_value_t *value, uint32_t size)
+njs_string_truncate(njs_value_t *value, uint32_t size, uint32_t length)
 {
-    u_char  *dst, *src;
+    u_char    *dst, *src;
+    uint32_t  n;
 
     if (size <= NJS_STRING_SHORT) {
-        if (value->short_string.size != NJS_STRING_LONG) {
-            value->short_string.size = size;
-
-        } else {
-            value->short_string.size = size;
+        if (value->short_string.size == NJS_STRING_LONG) {
             dst = value->short_string.start;
             src = value->long_string.data->start;
 
-            while (size != 0) {
+            n = size;
+
+            while (n != 0) {
                 /* The maximum size is just 14 bytes. */
                 njs_pragma_loop_disable_vectorization;
 
                 *dst++ = *src++;
-                size--;
+                n--;
             }
         }
 
+        value->short_string.size = size;
+        value->short_string.length = length;
+
     } else {
         value->long_string.size = size;
+        value->long_string.data->length = length;
     }
 }
 
@@ -1708,7 +1711,7 @@ njs_string_decode_hex(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src)
     }
 
     if (njs_slow_path((size_t) (p - dst) != (len / 2))) {
-        njs_string_truncate(value, p - dst);
+        njs_string_truncate(value, p - dst, 0);
     }
 
     return NJS_OK;
@@ -1825,7 +1828,7 @@ njs_decode_base64_core(njs_vm_t *vm, njs_value_t *value, const njs_str_t *src,
     }
 
     if (njs_slow_path((size_t) (d - dst) != dst_len)) {
-        njs_string_truncate(value, d - dst);
+        njs_string_truncate(value, d - dst, 0);
     }
 
     return NJS_OK;
index da300a4959e3268e6c397ceadd3cf313b31387c2..a1154cb3d6a6158592bec3f7dc168d2775757797 100644 (file)
@@ -173,7 +173,7 @@ njs_int_t njs_string_decode_base64(njs_vm_t *vm, njs_value_t *value,
     const njs_str_t *src);
 njs_int_t njs_string_decode_base64url(njs_vm_t *vm, njs_value_t *value,
     const njs_str_t *src);
-void njs_string_truncate(njs_value_t *value, uint32_t size);
+void njs_string_truncate(njs_value_t *value, uint32_t size, uint32_t length);
 void njs_string_copy(njs_value_t *dst, njs_value_t *src);
 njs_int_t njs_string_validate(njs_vm_t *vm, njs_string_prop_t *string,
     njs_value_t *value);