From 64e35f01a7934ced092141e5ae453014fa3d5000 Mon Sep 17 00:00:00 2001 From: Alexander Borisov Date: Wed, 22 Jul 2020 15:21:13 +0300 Subject: [PATCH] Fixed njs_string_truncate() function for non-byte strings. --- src/njs_fs.c | 2 +- src/njs_string.c | 25 ++++++++++++++----------- src/njs_string.h | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/njs_fs.c b/src/njs_fs.c index 4f7f0519..fad0678b 100644 --- a/src/njs_fs.c +++ b/src/njs_fs.c @@ -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; diff --git a/src/njs_string.c b/src/njs_string.c index 9aa24a26..6207288a 100644 --- a/src/njs_string.c +++ b/src/njs_string.c @@ -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; diff --git a/src/njs_string.h b/src/njs_string.h index da300a49..a1154cb3 100644 --- a/src/njs_string.h +++ b/src/njs_string.h @@ -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); -- 2.47.3