details: https://hg.nginx.org/njs/rev/742347841e34 branches: changeset: 2027:742347841e34 user: Dmitry Volyntsev <xei...@nginx.com> date: Fri Jan 20 20:15:03 2023 -0800 description: Added njs_vm_value_string_create() and njs_vm_value_string_create_chb().
Unlike njs_vm_value_string_set() the new functions always check the input string for a valid UTF8 and calculate UTF8 character length by themselves. diffstat: src/njs.h | 4 ++++ src/njs_chb.h | 2 +- src/njs_json.c | 11 +++-------- src/njs_regexp.c | 18 +++--------------- src/njs_string.c | 46 ++++++++++++++++++++++++++++++++-------------- src/njs_string.h | 2 ++ src/njs_vm.c | 16 ++++++++++++++++ src/test/njs_unit_test.c | 15 --------------- 8 files changed, 61 insertions(+), 53 deletions(-) diffs (255 lines): diff -r 8b9414a6e557 -r 742347841e34 src/njs.h --- a/src/njs.h Wed Jan 18 18:33:23 2023 -0800 +++ b/src/njs.h Fri Jan 20 20:15:03 2023 -0800 @@ -411,6 +411,10 @@ NJS_EXPORT njs_int_t njs_vm_value_string const u_char *start, uint32_t size); NJS_EXPORT u_char *njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size); +NJS_EXPORT njs_int_t njs_vm_value_string_create(njs_vm_t *vm, + njs_value_t *value, const u_char *start, uint32_t size); +NJS_EXPORT njs_int_t njs_vm_value_string_create_chb(njs_vm_t *vm, + njs_value_t *value, njs_chb_t *chain); NJS_EXPORT njs_int_t njs_vm_value_string_copy(njs_vm_t *vm, njs_str_t *retval, njs_value_t *value, uintptr_t *next); NJS_EXPORT njs_int_t njs_vm_string_compare(const njs_value_t *v1, diff -r 8b9414a6e557 -r 742347841e34 src/njs_chb.h --- a/src/njs_chb.h Wed Jan 18 18:33:23 2023 -0800 +++ b/src/njs_chb.h Fri Jan 20 20:15:03 2023 -0800 @@ -105,7 +105,7 @@ njs_chb_utf8_length(njs_chb_t *chain) while (n != NULL) { len = njs_utf8_length(n->start, njs_chb_node_size(n)); if (njs_slow_path(len < 0)) { - return 0; + return -1; } length += len; diff -r 8b9414a6e557 -r 742347841e34 src/njs_json.c --- a/src/njs_json.c Wed Jan 18 18:33:23 2023 -0800 +++ b/src/njs_json.c Fri Jan 20 20:15:03 2023 -0800 @@ -1090,8 +1090,7 @@ static njs_int_t njs_json_stringify_iterator(njs_vm_t *vm, njs_json_stringify_t *stringify, njs_value_t *object) { - u_char *p; - int64_t size, length; + int64_t size; njs_int_t ret; njs_chb_t chain; njs_value_t *key, *value, index, wrapper; @@ -1224,16 +1223,12 @@ done: goto release; } - length = njs_chb_utf8_length(&chain); - - p = njs_string_alloc(vm, &vm->retval, size, length); - if (njs_slow_path(p == NULL)) { + ret = njs_string_create_chb(vm, &vm->retval, &chain); + if (njs_slow_path(ret != NJS_OK)) { njs_chb_destroy(&chain); goto memory_error; } - njs_chb_join_to(&chain, p); - release: njs_chb_destroy(&chain); diff -r 8b9414a6e557 -r 742347841e34 src/njs_regexp.c --- a/src/njs_regexp.c Wed Jan 18 18:33:23 2023 -0800 +++ b/src/njs_regexp.c Fri Jan 20 20:15:03 2023 -0800 @@ -1197,8 +1197,7 @@ static njs_int_t njs_regexp_prototype_symbol_replace(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, njs_index_t unused) { - u_char *p; - int64_t n, last_index, ncaptures, pos, next_pos, size, length; + int64_t n, last_index, ncaptures, pos, next_pos, length; njs_str_t rep, m; njs_int_t ret; njs_arr_t results; @@ -1455,23 +1454,12 @@ njs_regexp_prototype_symbol_replace(njs_ njs_chb_append(&chain, &s.start[next_pos], s.size - next_pos); } - size = njs_chb_size(&chain); - if (njs_slow_path(size < 0)) { - njs_memory_error(vm); + ret = njs_string_create_chb(vm, &vm->retval, &chain); + if (njs_slow_path(ret != NJS_OK)) { ret = NJS_ERROR; goto exception; } - length = njs_chb_utf8_length(&chain); - - p = njs_string_alloc(vm, &vm->retval, size, length); - if (njs_slow_path(p == NULL)) { - ret = NJS_ERROR; - goto exception; - } - - njs_chb_join_to(&chain, p); - ret = NJS_OK; exception: diff -r 8b9414a6e557 -r 742347841e34 src/njs_string.c --- a/src/njs_string.c Wed Jan 18 18:33:23 2023 -0800 +++ b/src/njs_string.c Fri Jan 20 20:15:03 2023 -0800 @@ -147,6 +147,35 @@ njs_string_create(njs_vm_t *vm, njs_valu njs_int_t +njs_string_create_chb(njs_vm_t *vm, njs_value_t *value, njs_chb_t *chain) +{ + u_char *p; + ssize_t size, length; + + size = njs_chb_size(chain); + if (njs_slow_path(size < 0)) { + njs_memory_error(vm); + return NJS_ERROR; + } + + length = njs_chb_utf8_length(chain); + if (njs_slow_path(length < 0)) { + njs_memory_error(vm); + return NJS_ERROR; + } + + p = njs_string_alloc(vm, value, size, length); + if (njs_slow_path(p == NULL)) { + return NJS_ERROR; + } + + njs_chb_join_to(chain, p); + + return NJS_OK; +} + + +njs_int_t njs_string_new(njs_vm_t *vm, njs_value_t *value, const u_char *start, uint32_t size, uint32_t length) { @@ -3489,7 +3518,7 @@ njs_string_get_substitution(njs_vm_t *vm njs_value_t *string, int64_t pos, njs_value_t *captures, int64_t ncaptures, njs_value_t *groups, njs_value_t *replacement, njs_value_t *retval) { - int64_t tail, size, length, n; + int64_t tail, n; u_char c, c2, *p, *r, *end; njs_str_t rep, m, str, cap; njs_int_t ret; @@ -3620,23 +3649,12 @@ njs_string_get_substitution(njs_vm_t *vm done: - size = njs_chb_size(&chain); - if (njs_slow_path(size < 0)) { - njs_memory_error(vm); + ret = njs_string_create_chb(vm, retval, &chain); + if (njs_slow_path(ret != NJS_OK)) { ret = NJS_ERROR; goto exception; } - length = njs_chb_utf8_length(&chain); - - p = njs_string_alloc(vm, retval, size, length); - if (njs_slow_path(p == NULL)) { - ret = NJS_ERROR; - goto exception; - } - - njs_chb_join_to(&chain, p); - ret = NJS_OK; exception: diff -r 8b9414a6e557 -r 742347841e34 src/njs_string.h --- a/src/njs_string.h Wed Jan 18 18:33:23 2023 -0800 +++ b/src/njs_string.h Fri Jan 20 20:15:03 2023 -0800 @@ -200,6 +200,8 @@ njs_int_t njs_string_new(njs_vm_t *vm, n uint32_t size, uint32_t length); njs_int_t njs_string_create(njs_vm_t *vm, njs_value_t *value, const char *src, size_t size); +njs_int_t njs_string_create_chb(njs_vm_t *vm, njs_value_t *value, + njs_chb_t *chain); void njs_encode_hex(njs_str_t *dst, const njs_str_t *src); size_t njs_encode_hex_length(const njs_str_t *src, size_t *out_size); diff -r 8b9414a6e557 -r 742347841e34 src/njs_vm.c --- a/src/njs_vm.c Wed Jan 18 18:33:23 2023 -0800 +++ b/src/njs_vm.c Fri Jan 20 20:15:03 2023 -0800 @@ -832,6 +832,22 @@ njs_vm_value_string_alloc(njs_vm_t *vm, } +njs_int_t +njs_vm_value_string_create(njs_vm_t *vm, njs_value_t *value, + const u_char *start, uint32_t size) +{ + return njs_string_create(vm, value, (const char *) start, size); +} + + +njs_int_t +njs_vm_value_string_create_chb(njs_vm_t *vm, njs_value_t *value, + njs_chb_t *chain) +{ + return njs_string_create_chb(vm, value, chain); +} + + njs_function_t * njs_vm_function(njs_vm_t *vm, const njs_str_t *path) { diff -r 8b9414a6e557 -r 742347841e34 src/test/njs_unit_test.c --- a/src/test/njs_unit_test.c Wed Jan 18 18:33:23 2023 -0800 +++ b/src/test/njs_unit_test.c Fri Jan 20 20:15:03 2023 -0800 @@ -8984,9 +8984,6 @@ static njs_unit_test_t njs_test[] = { njs_str("'abc'.replace(/b/g, '$0')"), njs_str("a$0c") }, - { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).replace(/^/g, 1)"), - njs_str("string") }, - { njs_str("'abc'.replace(/^/g, '|$&|')"), njs_str("||abc") }, @@ -9060,12 +9057,6 @@ static njs_unit_test_t njs_test[] = "r[Symbol.replace]('foo', function() {m = arguments[0]}); [m, typeof m]"), njs_str("undefined,string") }, - { njs_str("String.bytesFrom([253,242,141,10]).replace(/\\s/g, 'X')[3]"), - njs_str("X") }, - - { njs_str("String.bytesFrom([255,149,15,97,95]).replace(/_/g, 'X')[4]"), - njs_str("X") }, - { njs_str("var a = [];" "a[2] = '';" "var re = /any_regexp/;" @@ -9271,9 +9262,6 @@ static njs_unit_test_t njs_test[] = "a +' '+ a.length"), njs_str("αα 4") }, - { njs_str("typeof String.bytesFrom(Array(15).fill(0xE3)).match(/^/g)"), - njs_str("object") }, - { njs_str("'abc'.split()"), njs_str("abc") }, @@ -18082,9 +18070,6 @@ static njs_unit_test_t njs_test[] = { njs_str("JSON.stringify('\\u00CE\\u00B1\\u00C2\\u00B6'.toBytes())"), njs_str("\"α¶\"") }, - { njs_str("JSON.stringify('µ§±®'.toBytes())"), - njs_str("\"\xB5\xA7\xB1\xAE\"") }, - /* Optional arguments. */ { njs_str("JSON.stringify(undefined, undefined, 1)"), _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel