details: https://hg.nginx.org/njs/rev/4e0553f7ea68 branches: changeset: 2329:4e0553f7ea68 user: Dmitry Volyntsev <xei...@nginx.com> date: Fri May 17 21:54:50 2024 -0700 description: Change: removed byte strings API.
These functions are unsafe because they produce byte strings. Byte strings may not work as expected with the existing JS methods. The following functions were removed: - njs_vm_value_string_set() use njs_vm_value_string_create() as a drop-in replacement. - njs_vm_value_string_alloc() use njs_chb_t and njs_vm_value_string_create_chb() instead. This fixes #710 on Github. diffstat: external/njs_query_string_module.c | 2 +- external/njs_shell.c | 4 +- external/njs_webcrypto_module.c | 54 ++++++------ external/njs_xml_module.c | 20 ++-- nginx/ngx_http_js_module.c | 150 ++++++++++++++---------------------- nginx/ngx_js.c | 34 ++++---- nginx/ngx_js.h | 2 +- nginx/ngx_js_fetch.c | 32 +++--- nginx/ngx_js_shared_dict.c | 25 +++-- nginx/ngx_stream_js_module.c | 4 +- src/njs.h | 8 - src/njs_string.c | 2 +- src/njs_vm.c | 19 +---- src/test/njs_benchmark.c | 12 +- src/test/njs_externals_test.c | 38 ++++---- src/test/njs_unit_test.c | 32 +++--- 16 files changed, 193 insertions(+), 245 deletions(-) diffs (truncated from 1114 to 1000 lines): diff -r dec46ad52e9a -r 4e0553f7ea68 external/njs_query_string_module.c --- a/external/njs_query_string_module.c Fri May 17 21:54:49 2024 -0700 +++ b/external/njs_query_string_module.c Fri May 17 21:54:50 2024 -0700 @@ -694,7 +694,7 @@ njs_query_string_stringify(njs_vm_t *vm, object = njs_arg(args, nargs, 1); if (njs_slow_path(!njs_value_is_object(object))) { - njs_vm_value_string_set(vm, retval, (u_char *) "", 0); + njs_vm_value_string_create(vm, retval, (u_char *) "", 0); return NJS_OK; } diff -r dec46ad52e9a -r 4e0553f7ea68 external/njs_shell.c --- a/external/njs_shell.c Fri May 17 21:54:49 2024 -0700 +++ b/external/njs_shell.c Fri May 17 21:54:50 2024 -0700 @@ -1579,8 +1579,8 @@ njs_engine_njs_complete(njs_engine_t *en while (p < end && *p != '.') { p++; } - ret = njs_vm_value_string_set(vm, njs_value_arg(&key), start, - p - start); + ret = njs_vm_value_string_create(vm, njs_value_arg(&key), start, + p - start); if (njs_slow_path(ret != NJS_OK)) { return NULL; } diff -r dec46ad52e9a -r 4e0553f7ea68 external/njs_webcrypto_module.c --- a/external/njs_webcrypto_module.c Fri May 17 21:54:49 2024 -0700 +++ b/external/njs_webcrypto_module.c Fri May 17 21:54:50 2024 -0700 @@ -1855,7 +1855,7 @@ njs_export_jwk_rsa(njs_vm_t *vm, njs_web return NJS_ERROR; } - njs_vm_value_string_set(vm, njs_value_arg(&rsa_s), (u_char *) "RSA", 3); + njs_vm_value_string_create(vm, njs_value_arg(&rsa_s), (u_char *) "RSA", 3); ret = njs_vm_object_prop_set(vm, retval, &string_kty, &rsa_s); if (ret != NJS_OK) { @@ -1909,8 +1909,8 @@ njs_export_jwk_rsa(njs_vm_t *vm, njs_web nm = &njs_webcrypto_alg_name[key->alg->type][key->hash]; - (void) njs_vm_value_string_set(vm, njs_value_arg(&alg), nm->start, - nm->length); + (void) njs_vm_value_string_create(vm, njs_value_arg(&alg), nm->start, + nm->length); return njs_vm_object_prop_set(vm, retval, &string_alg, &alg); } @@ -1975,8 +1975,8 @@ njs_export_jwk_ec(njs_vm_t *vm, njs_webc nid = EC_GROUP_get_curve_name(group); cname = njs_algorithm_curve_name(nid); - (void) njs_vm_value_string_set(vm, njs_value_arg(&name), - cname->start, cname->length); + (void) njs_vm_value_string_create(vm, njs_value_arg(&name), + cname->start, cname->length); if (cname->length == 0) { njs_vm_type_error(vm, "Unsupported JWK EC curve: %s", OBJ_nid2sn(nid)); @@ -1988,7 +1988,7 @@ njs_export_jwk_ec(njs_vm_t *vm, njs_webc goto fail; } - njs_vm_value_string_set(vm, njs_value_arg(&ec_s), (u_char *) "EC", 2); + njs_vm_value_string_create(vm, njs_value_arg(&ec_s), (u_char *) "EC", 2); ret = njs_vm_object_prop_set(vm, retval, &string_kty, &ec_s); if (ret != NJS_OK) { @@ -2154,8 +2154,8 @@ njs_export_jwk_oct(njs_vm_t *vm, njs_web if (key->alg->type == NJS_ALGORITHM_HMAC) { nm = &njs_webcrypto_alg_name[type][key->hash]; - (void) njs_vm_value_string_set(vm, njs_value_arg(&alg), nm->start, - nm->length); + (void) njs_vm_value_string_create(vm, njs_value_arg(&alg), nm->start, + nm->length); } else { switch (key->u.s.raw.length) { @@ -2164,8 +2164,8 @@ njs_export_jwk_oct(njs_vm_t *vm, njs_web case 32: nm = &njs_webcrypto_alg_aes_name [type - NJS_ALGORITHM_AES_GCM][(key->u.s.raw.length - 16) / 8]; - (void) njs_vm_value_string_set(vm, njs_value_arg(&alg), nm->start, - nm->length); + (void) njs_vm_value_string_create(vm, njs_value_arg(&alg), + nm->start, nm->length); break; default: @@ -2186,7 +2186,7 @@ njs_export_jwk_oct(njs_vm_t *vm, njs_web return NJS_ERROR; } - njs_vm_value_string_set(vm, njs_value_arg(&oct_s), (u_char *) "oct", 3); + njs_vm_value_string_create(vm, njs_value_arg(&oct_s), (u_char *) "oct", 3); ret = njs_vm_object_prop_set(vm, retval, &string_kty, &oct_s); if (ret != NJS_OK) { @@ -4150,14 +4150,14 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_ } name = &njs_webcrypto_alg[key->alg->type].name; - ret = njs_vm_value_string_set(vm, njs_value_arg(&alg), name->start, - name->length); + ret = njs_vm_value_string_create(vm, njs_value_arg(&alg), name->start, + name->length); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } - (void) njs_vm_value_string_set(vm, njs_value_arg(&name_s), - (u_char *) "name", njs_length("name")); + (void) njs_vm_value_string_create(vm, njs_value_arg(&name_s), + (u_char *) "name", njs_length("name")); ret = njs_vm_object_alloc(vm, retval, &name_s, &alg, NULL); if (njs_slow_path(ret != NJS_OK)) { @@ -4203,8 +4203,8 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_ } name = njs_algorithm_hash_name(key->hash); - ret = njs_vm_value_string_set(vm, njs_value_arg(&hash), name->start, - name->length); + ret = njs_vm_value_string_create(vm, njs_value_arg(&hash), name->start, + name->length); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -4252,8 +4252,8 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_ name = njs_algorithm_curve_name(EC_GROUP_get_curve_name(group)); - ret = njs_vm_value_string_set(vm, njs_value_arg(&val), name->start, - name->length); + ret = njs_vm_value_string_create(vm, njs_value_arg(&val), name->start, + name->length); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -4270,8 +4270,8 @@ njs_key_ext_algorithm(njs_vm_t *vm, njs_ /* HmacKeyGenParams */ name = njs_algorithm_hash_name(key->hash); - ret = njs_vm_value_string_set(vm, njs_value_arg(&val), name->start, - name->length); + ret = njs_vm_value_string_create(vm, njs_value_arg(&val), name->start, + name->length); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -4320,12 +4320,12 @@ njs_key_ext_type(njs_vm_t *vm, njs_objec } if (key->alg->raw) { - (void) njs_vm_value_string_set(vm, retval, (u_char *) "secret", - njs_length("secret")); + (void) njs_vm_value_string_create(vm, retval, (u_char *) "secret", + njs_length("secret")); } else { type = key->u.a.privat ? "private": "public"; - (void) njs_vm_value_string_set(vm, retval, (u_char *) type, - key->u.a.privat ? 7 : 6); + (void) njs_vm_value_string_create(vm, retval, (u_char *) type, + key->u.a.privat ? 7 : 6); } return NJS_OK; @@ -4544,8 +4544,8 @@ njs_key_ops(njs_vm_t *vm, njs_value_t *r return NJS_ERROR; } - ret = njs_vm_value_string_set(vm, value, e->name.start, - e->name.length); + ret = njs_vm_value_string_create(vm, value, e->name.start, + e->name.length); if (ret != NJS_OK) { return NJS_ERROR; } diff -r dec46ad52e9a -r 4e0553f7ea68 external/njs_xml_module.c --- a/external/njs_xml_module.c Fri May 17 21:54:49 2024 -0700 +++ b/external/njs_xml_module.c Fri May 17 21:54:50 2024 -0700 @@ -584,8 +584,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, return NJS_ERROR; } - ret = njs_vm_value_string_set(vm, push, (u_char *) "$name", - njs_length("$name")); + ret = njs_vm_value_string_create(vm, push, (u_char *) "$name", + njs_length("$name")); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -597,8 +597,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, return NJS_ERROR; } - ret = njs_vm_value_string_set(vm, push, (u_char *) "$ns", - njs_length("$ns")); + ret = njs_vm_value_string_create(vm, push, (u_char *) "$ns", + njs_length("$ns")); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -610,8 +610,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, return NJS_ERROR; } - ret = njs_vm_value_string_set(vm, push, (u_char *) "$attrs", - njs_length("$attrs")); + ret = njs_vm_value_string_create(vm, push, (u_char *) "$attrs", + njs_length("$attrs")); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -623,8 +623,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, return NJS_ERROR; } - ret = njs_vm_value_string_set(vm, push, (u_char *) "$text", - njs_length("$text")); + ret = njs_vm_value_string_create(vm, push, (u_char *) "$text", + njs_length("$text")); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } @@ -640,8 +640,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, return NJS_ERROR; } - ret = njs_vm_value_string_set(vm, push, (u_char *) "$tags", - njs_length("$tags")); + ret = njs_vm_value_string_create(vm, push, (u_char *) "$tags", + njs_length("$tags")); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } diff -r dec46ad52e9a -r 4e0553f7ea68 nginx/ngx_http_js_module.c --- a/nginx/ngx_http_js_module.c Fri May 17 21:54:49 2024 -0700 +++ b/nginx/ngx_http_js_module.c Fri May 17 21:54:50 2024 -0700 @@ -1144,8 +1144,8 @@ ngx_http_js_body_filter(ngx_http_request njs_value_assign(&arguments[0], &ctx->request); - njs_vm_value_string_set(ctx->vm, njs_value_arg(&last_key), - last_str.start, last_str.length); + njs_vm_value_string_create(ctx->vm, njs_value_arg(&last_key), + last_str.start, last_str.length); while (in != NULL) { ctx->buf = in->buf; @@ -1474,7 +1474,7 @@ ngx_http_js_ext_keys_header(njs_vm_t *vm return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, h->key.data, h->key.len); + rc = njs_vm_value_string_create(vm, value, h->key.data, h->key.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -1586,7 +1586,7 @@ ngx_http_js_ext_raw_header(njs_vm_t *vm, return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, elem, h->key.data, h->key.len); + rc = njs_vm_value_string_create(vm, elem, h->key.data, h->key.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -1596,7 +1596,7 @@ ngx_http_js_ext_raw_header(njs_vm_t *vm, return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, elem, h->value.data, h->value.len); + rc = njs_vm_value_string_create(vm, elem, h->value.data, h->value.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -1703,7 +1703,8 @@ ngx_http_js_header_single(njs_vm_t *vm, return NJS_DECLINED; } - rc = njs_vm_value_string_set(vm, retval, h->value.data, h->value.len); + rc = njs_vm_value_string_create(vm, retval, h->value.data, + h->value.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -1845,8 +1846,8 @@ ngx_http_js_header_array(njs_vm_t *vm, n return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, h->value.data, - h->value.len); + rc = njs_vm_value_string_create(vm, value, h->value.data, + h->value.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -1934,7 +1935,7 @@ ngx_http_js_header_generic(njs_vm_t *vm, return NJS_DECLINED; } - return njs_vm_value_string_set(vm, retval, start, p - start); + return njs_vm_value_string_create(vm, retval, start, p - start); } header = part->elts; @@ -2110,8 +2111,8 @@ ngx_http_js_ext_keys_header_out(njs_vm_t return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, (u_char *) "Content-Type", - njs_length("Content-Type")); + rc = njs_vm_value_string_create(vm, value, (u_char *) "Content-Type", + njs_length("Content-Type")); if (rc != NJS_OK) { return NJS_ERROR; } @@ -2125,8 +2126,8 @@ ngx_http_js_ext_keys_header_out(njs_vm_t return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, (u_char *) "Content-Length", - njs_length("Content-Length")); + rc = njs_vm_value_string_create(vm, value, (u_char *) "Content-Length", + njs_length("Content-Length")); if (rc != NJS_OK) { return NJS_ERROR; } @@ -2573,7 +2574,7 @@ ngx_http_js_ext_get_http_version(njs_vm_ break; } - return njs_vm_value_string_set(vm, retval, v.data, v.len); + return njs_vm_value_string_create(vm, retval, v.data, v.len); } @@ -2610,8 +2611,8 @@ ngx_http_js_ext_get_remote_address(njs_v c = r->connection; - return njs_vm_value_string_set(vm, retval, c->addr_text.data, - c->addr_text.len); + return njs_vm_value_string_create(vm, retval, c->addr_text.data, + c->addr_text.len); } @@ -2819,52 +2820,36 @@ static njs_int_t ngx_http_js_header_in_array(njs_vm_t *vm, ngx_http_request_t *r, ngx_array_t *array, u_char sep, njs_value_t *retval) { - u_char *p, *end; - size_t len; + njs_chb_t chain; + njs_int_t ret; ngx_uint_t i, n; ngx_table_elt_t **hh; n = array->nelts; hh = array->elts; - len = 0; - - for (i = 0; i < n; i++) { - len += hh[i]->value.len + 1; - } - - if (len == 0) { + if (n == 0) { njs_value_undefined_set(retval); return NJS_DECLINED; } - len -= 1; - if (n == 1) { - return njs_vm_value_string_set(vm, retval, (*hh)->value.data, - (*hh)->value.len); - } - - p = njs_vm_value_string_alloc(vm, retval, len); - if (p == NULL) { - return NJS_ERROR; - } - - end = p + len; - - - for (i = 0; /* void */ ; i++) { - - p = ngx_copy(p, hh[i]->value.data, hh[i]->value.len); - - if (p == end) { - break; - } - - *p++ = sep; - } - - return NJS_OK; + return njs_vm_value_string_create(vm, retval, (*hh)->value.data, + (*hh)->value.len); + } + + NJS_CHB_MP_INIT(&chain, vm); + + for (i = 0; i < n; i++) { + njs_chb_append(&chain, hh[i]->value.data, hh[i]->value.len); + njs_chb_append(&chain, &sep, 1); + } + + ret = njs_vm_value_string_create_chb(vm, retval, &chain); + + njs_chb_destroy(&chain); + + return ret; } #else static njs_int_t @@ -3889,9 +3874,9 @@ ngx_http_js_header_generic(njs_vm_t *vm, ngx_list_t *headers, ngx_table_elt_t **ph, unsigned flags, njs_str_t *name, njs_value_t *retval) { - u_char *p, sep; - ssize_t size; - njs_int_t rc; + u_char sep; + njs_chb_t chain; + njs_int_t rc, ret; ngx_uint_t i; njs_value_t *value; ngx_list_part_t *part; @@ -3949,8 +3934,8 @@ ngx_http_js_header_generic(njs_vm_t *vm, return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, h->value.data, - h->value.len); + rc = njs_vm_value_string_create(vm, value, h->value.data, + h->value.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -3960,34 +3945,25 @@ ngx_http_js_header_generic(njs_vm_t *vm, } if ((*ph)->next == NULL || flags & NJS_HEADER_SINGLE) { - return njs_vm_value_string_set(vm, retval, (*ph)->value.data, - (*ph)->value.len); - } - - size = - (ssize_t) njs_length("; "); - - for (h = *ph; h; h = h->next) { - size += h->value.len + njs_length("; "); - } - - p = njs_vm_value_string_alloc(vm, retval, size); - if (p == NULL) { - return NJS_ERROR; - } + return njs_vm_value_string_create(vm, retval, (*ph)->value.data, + (*ph)->value.len); + } + + NJS_CHB_MP_INIT(&chain, vm); sep = flags & NJS_HEADER_SEMICOLON ? ';' : ','; for (h = *ph; h; h = h->next) { - p = ngx_copy(p, h->value.data, h->value.len); - - if (h->next == NULL) { - break; - } - - *p++ = sep; *p++ = ' '; - } - - return NJS_OK; + njs_chb_append(&chain, h->value.data, h->value.len); + njs_chb_append(&chain, &sep, 1); + njs_chb_append_literal(&chain, " "); + } + + ret = njs_vm_value_string_create_chb(vm, retval, &chain); + + njs_chb_destroy(&chain); + + return ret; } #endif @@ -4016,7 +3992,7 @@ static njs_int_t ngx_http_js_content_length(njs_vm_t *vm, ngx_http_request_t *r, unsigned flags, njs_str_t *v, njs_value_t *setval, njs_value_t *retval) { - u_char *p, *start; + u_char *p; njs_int_t rc; ngx_int_t n; ngx_table_elt_t *h; @@ -4028,14 +4004,8 @@ ngx_http_js_content_length(njs_vm_t *vm, { p = ngx_sprintf(content_len, "%O", r->headers_out.content_length_n); - start = njs_vm_value_string_alloc(vm, retval, p - content_len); - if (start == NULL) { - return NJS_ERROR; - } - - ngx_memcpy(start, content_len, p - content_len); - - return NJS_OK; + return njs_vm_value_string_create(vm, retval, content_len, + p - content_len); } } @@ -4084,7 +4054,7 @@ ngx_http_js_content_type(njs_vm_t *vm, n return NJS_OK; } - return njs_vm_value_string_set(vm, retval, hdr->data, hdr->len); + return njs_vm_value_string_create(vm, retval, hdr->data, hdr->len); } if (setval != NULL && njs_value_is_array(setval)) { diff -r dec46ad52e9a -r 4e0553f7ea68 nginx/ngx_js.c --- a/nginx/ngx_js.c Fri May 17 21:54:49 2024 -0700 +++ b/nginx/ngx_js.c Fri May 17 21:54:50 2024 -0700 @@ -668,7 +668,7 @@ ngx_js_ext_string(njs_vm_t *vm, njs_obje field = (ngx_str_t *) (p + njs_vm_prop_magic32(prop)); - return njs_vm_value_string_set(vm, retval, field->data, field->len); + return njs_vm_value_string_create(vm, retval, field->data, field->len); } @@ -745,15 +745,15 @@ njs_int_t ngx_js_ext_build(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, + return njs_vm_value_string_create(vm, retval, #ifdef NGX_BUILD - (u_char *) NGX_BUILD, - njs_strlen(NGX_BUILD) + (u_char *) NGX_BUILD, + njs_strlen(NGX_BUILD) #else - (u_char *) "", - 0 + (u_char *) "", + 0 #endif - ); + ); } @@ -761,8 +761,8 @@ njs_int_t ngx_js_ext_conf_file_path(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, ngx_cycle->conf_file.data, - ngx_cycle->conf_file.len); + return njs_vm_value_string_create(vm, retval, ngx_cycle->conf_file.data, + ngx_cycle->conf_file.len); } @@ -770,8 +770,8 @@ njs_int_t ngx_js_ext_conf_prefix(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, ngx_cycle->conf_prefix.data, - ngx_cycle->conf_prefix.len); + return njs_vm_value_string_create(vm, retval, ngx_cycle->conf_prefix.data, + ngx_cycle->conf_prefix.len); } @@ -779,8 +779,8 @@ njs_int_t ngx_js_ext_error_log_path(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, ngx_cycle->error_log.data, - ngx_cycle->error_log.len); + return njs_vm_value_string_create(vm, retval, ngx_cycle->error_log.data, + ngx_cycle->error_log.len); } @@ -788,8 +788,8 @@ njs_int_t ngx_js_ext_prefix(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, ngx_cycle->prefix.data, - ngx_cycle->prefix.len); + return njs_vm_value_string_create(vm, retval, ngx_cycle->prefix.data, + ngx_cycle->prefix.len); } @@ -797,8 +797,8 @@ njs_int_t ngx_js_ext_version(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, (u_char *) NGINX_VERSION, - njs_strlen(NGINX_VERSION)); + return njs_vm_value_string_create(vm, retval, (u_char *) NGINX_VERSION, + njs_strlen(NGINX_VERSION)); } diff -r dec46ad52e9a -r 4e0553f7ea68 nginx/ngx_js.h --- a/nginx/ngx_js.h Fri May 17 21:54:49 2024 -0700 +++ b/nginx/ngx_js.h Fri May 17 21:54:50 2024 -0700 @@ -175,7 +175,7 @@ struct ngx_js_ctx_s { #define ngx_js_prop(vm, type, value, start, len) \ - ((type == NGX_JS_STRING) ? njs_vm_value_string_set(vm, value, start, len) \ + ((type == NGX_JS_STRING) ? njs_vm_value_string_create(vm, value, start, len) \ : njs_vm_value_buffer_set(vm, value, start, len)) diff -r dec46ad52e9a -r 4e0553f7ea68 nginx/ngx_js_fetch.c --- a/nginx/ngx_js_fetch.c Fri May 17 21:54:49 2024 -0700 +++ b/nginx/ngx_js_fetch.c Fri May 17 21:54:50 2024 -0700 @@ -3237,8 +3237,8 @@ ngx_headers_js_get(njs_vm_t *vm, njs_val return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, ph->value.data, - ph->value.len); + rc = njs_vm_value_string_create(vm, value, ph->value.data, + ph->value.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -3283,7 +3283,7 @@ ngx_headers_js_get(njs_vm_t *vm, njs_val h = h->next; } - return njs_vm_value_string_set(vm, retval, data, p - data); + return njs_vm_value_string_create(vm, retval, data, p - data); } @@ -3574,8 +3574,8 @@ ngx_headers_js_ext_keys(njs_vm_t *vm, nj return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, h[i].key.data, - h[i].key.len); + rc = njs_vm_value_string_create(vm, value, h[i].key.data, + h[i].key.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -3709,9 +3709,9 @@ ngx_request_js_ext_body(njs_vm_t *vm, nj case NGX_JS_BODY_JSON: case NGX_JS_BODY_TEXT: default: - ret = njs_vm_value_string_set(vm, njs_value_arg(&result), - request->body.start, - request->body.length); + ret = njs_vm_value_string_create(vm, njs_value_arg(&result), + request->body.start, + request->body.length); if (ret != NJS_OK) { njs_vm_memory_error(vm); return NJS_ERROR; @@ -3869,8 +3869,8 @@ ngx_response_js_ext_body(njs_vm_t *vm, n case NGX_JS_BODY_JSON: case NGX_JS_BODY_TEXT: default: - ret = njs_vm_value_string_set(vm, njs_value_arg(&result), - string.start, string.length); + ret = njs_vm_value_string_create(vm, njs_value_arg(&result), + string.start, string.length); if (ret != NJS_OK) { njs_vm_memory_error(vm); return NJS_ERROR; @@ -3985,8 +3985,8 @@ ngx_response_js_ext_status_text(njs_vm_t return NJS_DECLINED; } - njs_vm_value_string_set(vm, retval, response->status_text.start, - response->status_text.length); + njs_vm_value_string_create(vm, retval, response->status_text.start, + response->status_text.length); return NJS_OK; } @@ -4004,8 +4004,8 @@ ngx_response_js_ext_type(njs_vm_t *vm, n return NJS_DECLINED; } - return njs_vm_value_string_set(vm, retval, (u_char *) "basic", - njs_length("basic")); + return njs_vm_value_string_create(vm, retval, (u_char *) "basic", + njs_length("basic")); } @@ -4017,8 +4017,8 @@ ngx_fetch_flag(njs_vm_t *vm, const ngx_j for (e = entries; e->name.length != 0; e++) { if (e->value == value) { - return njs_vm_value_string_set(vm, retval, e->name.start, - e->name.length); + return njs_vm_value_string_create(vm, retval, e->name.start, + e->name.length); } } diff -r dec46ad52e9a -r 4e0553f7ea68 nginx/ngx_js_shared_dict.c --- a/nginx/ngx_js_shared_dict.c Fri May 17 21:54:49 2024 -0700 +++ b/nginx/ngx_js_shared_dict.c Fri May 17 21:54:50 2024 -0700 @@ -423,8 +423,8 @@ njs_js_ext_global_shared_keys(njs_vm_t * return NJS_ERROR; } - rc = njs_vm_value_string_set(vm, value, shm_zone->shm.name.data, - shm_zone->shm.name.len); + rc = njs_vm_value_string_create(vm, value, shm_zone->shm.name.data, + shm_zone->shm.name.len); if (rc != NJS_OK) { return NJS_ERROR; } @@ -698,8 +698,8 @@ njs_js_ext_shared_dict_keys(njs_vm_t *vm goto fail; } - rc = njs_vm_value_string_set(vm, value, node->sn.str.data, - node->sn.str.len); + rc = njs_vm_value_string_create(vm, value, node->sn.str.data, + node->sn.str.len); if (rc != NJS_OK) { goto fail; } @@ -853,8 +853,8 @@ njs_js_ext_shared_dict_items(njs_vm_t *v goto fail; } - rc = njs_vm_value_string_set(vm, value, node->sn.str.data, - node->sn.str.len); + rc = njs_vm_value_string_create(vm, value, node->sn.str.data, + node->sn.str.len); if (rc != NJS_OK) { goto fail; } @@ -896,8 +896,8 @@ njs_js_ext_shared_dict_name(njs_vm_t *vm return NJS_DECLINED; } - return njs_vm_value_string_set(vm, retval, shm_zone->shm.name.data, - shm_zone->shm.name.len); + return njs_vm_value_string_create(vm, retval, shm_zone->shm.name.data, + shm_zone->shm.name.len); } @@ -1063,7 +1063,7 @@ njs_js_ext_shared_dict_type(njs_vm_t *vm break; } - return njs_vm_value_string_set(vm, retval, type.start, type.length); + return njs_vm_value_string_create(vm, retval, type.start, type.length); } @@ -1406,7 +1406,8 @@ ngx_js_dict_copy_value_locked(njs_vm_t * return NGX_ERROR; } - ret = njs_vm_value_string_set(vm, retval, string.start, string.length); + ret = njs_vm_value_string_create(vm, retval, string.start, + string.length); if (ret != NJS_OK) { return NGX_ERROR; } @@ -1493,8 +1494,8 @@ static njs_int_t ngx_js_dict_shared_error_name(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, (u_char *) "SharedMemoryError", - 17); + return njs_vm_value_string_create(vm, retval, + (u_char *) "SharedMemoryError", 17); } diff -r dec46ad52e9a -r 4e0553f7ea68 nginx/ngx_stream_js_module.c --- a/nginx/ngx_stream_js_module.c Fri May 17 21:54:49 2024 -0700 +++ b/nginx/ngx_stream_js_module.c Fri May 17 21:54:50 2024 -0700 @@ -1241,8 +1241,8 @@ ngx_stream_js_ext_get_remote_address(njs c = s->connection; - return njs_vm_value_string_set(vm, retval, c->addr_text.data, - c->addr_text.len); + return njs_vm_value_string_create(vm, retval, c->addr_text.data, + c->addr_text.len); } diff -r dec46ad52e9a -r 4e0553f7ea68 src/njs.h --- a/src/njs.h Fri May 17 21:54:49 2024 -0700 +++ b/src/njs.h Fri May 17 21:54:50 2024 -0700 @@ -400,14 +400,6 @@ NJS_EXPORT njs_int_t njs_value_to_intege /* Gets string value, no copy. */ NJS_EXPORT void njs_value_string_get(njs_value_t *value, njs_str_t *dst); -/* - * Sets a byte string value. - * start data is not copied and should not be freed. - */ -NJS_EXPORT njs_int_t njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value, - 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, diff -r dec46ad52e9a -r 4e0553f7ea68 src/njs_string.c --- a/src/njs_string.c Fri May 17 21:54:49 2024 -0700 +++ b/src/njs_string.c Fri May 17 21:54:50 2024 -0700 @@ -3152,7 +3152,7 @@ njs_string_get_substitution(njs_vm_t *vm p += 2; - ret = njs_vm_value_string_set(vm, &name, p, r - p); + ret = njs_string_create(vm, &name, (const char *) p, r - p); if (njs_slow_path(ret != NJS_OK)) { goto exception; } diff -r dec46ad52e9a -r 4e0553f7ea68 src/njs_vm.c --- a/src/njs_vm.c Fri May 17 21:54:49 2024 -0700 +++ b/src/njs_vm.c Fri May 17 21:54:50 2024 -0700 @@ -946,14 +946,6 @@ njs_value_string_get(njs_value_t *value, njs_int_t -njs_vm_value_string_set(njs_vm_t *vm, njs_value_t *value, const u_char *start, - uint32_t size) -{ - return njs_string_set(vm, value, start, size); -} - - -njs_int_t njs_vm_value_array_buffer_set(njs_vm_t *vm, njs_value_t *value, const u_char *start, uint32_t size) { @@ -981,13 +973,6 @@ njs_vm_value_buffer_set(njs_vm_t *vm, nj } -u_char * -njs_vm_value_string_alloc(njs_vm_t *vm, njs_value_t *value, uint32_t size) -{ - return njs_string_alloc(vm, value, size, 0); -} - - njs_int_t njs_vm_value_string_create(njs_vm_t *vm, njs_value_t *value, const u_char *start, uint32_t size) @@ -1342,7 +1327,7 @@ njs_vm_object_prop(njs_vm_t *vm, njs_val return NULL; } - ret = njs_vm_value_string_set(vm, &key, prop->start, prop->length); + ret = njs_vm_value_string_create(vm, &key, prop->start, prop->length); if (njs_slow_path(ret != NJS_OK)) { return NULL; } @@ -1368,7 +1353,7 @@ njs_vm_object_prop_set(njs_vm_t *vm, njs return NJS_ERROR; } - ret = njs_vm_value_string_set(vm, &key, prop->start, prop->length); + ret = njs_vm_value_string_create(vm, &key, prop->start, prop->length); if (njs_slow_path(ret != NJS_OK)) { return NJS_ERROR; } diff -r dec46ad52e9a -r 4e0553f7ea68 src/test/njs_benchmark.c --- a/src/test/njs_benchmark.c Fri May 17 21:54:49 2024 -0700 +++ b/src/test/njs_benchmark.c Fri May 17 21:54:50 2024 -0700 @@ -188,10 +188,10 @@ njs_benchmark_test(njs_vm_t *parent, njs goto done; } - ret = njs_vm_value_string_set(parent, &name, (u_char *) test->name, - njs_strlen(test->name)); + ret = njs_vm_value_string_create(parent, &name, (u_char *) test->name, + njs_strlen(test->name)); if (ret != NJS_OK) { - njs_printf("njs_vm_value_string_set() failed\n"); + njs_printf("njs_vm_value_string_create() failed\n"); goto done; } @@ -595,10 +595,10 @@ main(int argc, char **argv) } if (opts.previous) { - ret = njs_vm_value_string_set(vm, &args[0], (u_char *) opts.previous, - njs_strlen(opts.previous)); + ret = njs_vm_value_string_create(vm, &args[0], (u_char *) opts.previous, + njs_strlen(opts.previous)); if (ret != NJS_OK) { - njs_printf("njs_vm_value_string_set() failed\n"); + njs_printf("njs_vm_value_string_create() failed\n"); goto done; } diff -r dec46ad52e9a -r 4e0553f7ea68 src/test/njs_externals_test.c --- a/src/test/njs_externals_test.c Fri May 17 21:54:49 2024 -0700 +++ b/src/test/njs_externals_test.c Fri May 17 21:54:50 2024 -0700 @@ -158,7 +158,7 @@ njs_unit_test_r_uri(njs_vm_t *vm, njs_ob return njs_vm_value_to_bytes(vm, field, setval); } - return njs_vm_value_string_set(vm, retval, field->start, field->length); + return njs_vm_value_string_create(vm, retval, field->start, field->length); } @@ -178,7 +178,7 @@ njs_unit_test_r_a(njs_vm_t *vm, njs_obje p = njs_sprintf(buf, buf + njs_length(buf), "%uD", r->a); - return njs_vm_value_string_set(vm, retval, buf, p - buf); + return njs_vm_value_string_create(vm, retval, buf, p - buf); } @@ -214,7 +214,7 @@ static njs_int_t njs_unit_test_r_host(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *setval, njs_value_t *retval) { - return njs_vm_value_string_set(vm, retval, (u_char *) "АБВГДЕЁЖЗИЙ", 22); + return njs_vm_value_string_create(vm, retval, (u_char *) "АБВГДЕЁЖЗИЙ", 22); } @@ -264,7 +264,7 @@ njs_unit_test_r_vars(njs_vm_t *vm, njs_o if (setval != NULL) { /* Set. */ - njs_vm_value_string_set(vm, &name, lhq.key.start, lhq.key.length); + njs_vm_value_string_create(vm, &name, lhq.key.start, lhq.key.length); prop = lvlhsh_unit_test_alloc(vm->mem_pool, &name, setval); if (prop == NULL) { njs_memory_error(vm); @@ -313,24 +313,22 @@ static njs_int_t njs_unit_test_r_header(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, njs_value_t *unused, njs_value_t *retval) { - u_char *p; - uint32_t size; njs_int_t ret; njs_str_t h; + njs_chb_t chain; ret = njs_vm_prop_name(vm, prop, &h); if (ret == NJS_OK) { - size = 7 + h.length; + NJS_CHB_MP_INIT(&chain, vm); + + njs_chb_append(&chain, h.start, h.length); + njs_chb_append(&chain, (u_char *) "|АБВ", njs_length("|АБВ")); - p = njs_vm_value_string_alloc(vm, retval, size); - if (p == NULL) { - return NJS_ERROR; - } + ret = njs_vm_value_string_create_chb(vm, retval, &chain); - p = njs_cpymem(p, h.start, h.length); - *p++ = '|'; - memcpy(p, "АБВ", njs_length("АБВ")); - return NJS_OK; + njs_chb_destroy(&chain); + + return ret; } njs_value_undefined_set(retval); @@ -360,7 +358,7 @@ njs_unit_test_r_header_keys(njs_vm_t *vm _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org https://mailman.nginx.org/mailman/listinfo/nginx-devel