From: Dmitry Volyntsev Date: Sat, 18 May 2024 04:54:50 +0000 (-0700) Subject: Change: removed byte strings API. X-Git-Tag: 0.8.5~30 X-Git-Url: http://www.kaiwu.me/postgresql/commit/?a=commitdiff_plain;h=5730d5ffe23a4965c001d873695d22005fcfa588;p=njs.git 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. --- diff --git a/external/njs_query_string_module.c b/external/njs_query_string_module.c index f61bb97a..f9b7c552 100644 --- a/external/njs_query_string_module.c +++ b/external/njs_query_string_module.c @@ -694,7 +694,7 @@ njs_query_string_stringify(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, 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 --git a/external/njs_shell.c b/external/njs_shell.c index cc4bf8e4..e00f2529 100644 --- a/external/njs_shell.c +++ b/external/njs_shell.c @@ -1579,8 +1579,8 @@ njs_engine_njs_complete(njs_engine_t *engine, njs_str_t *expression) 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 --git a/external/njs_webcrypto_module.c b/external/njs_webcrypto_module.c index b8adc0b2..d4725d89 100644 --- a/external/njs_webcrypto_module.c +++ b/external/njs_webcrypto_module.c @@ -1855,7 +1855,7 @@ njs_export_jwk_rsa(njs_vm_t *vm, njs_webcrypto_key_t *key, njs_value_t *retval) 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_webcrypto_key_t *key, njs_value_t *retval) 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_webcrypto_key_t *key, njs_value_t *retval) 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_webcrypto_key_t *key, njs_value_t *retval) 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_webcrypto_key_t *key, njs_value_t *retval) 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_webcrypto_key_t *key, njs_value_t *retval) 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_webcrypto_key_t *key, njs_value_t *retval) 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_object_prop_t *prop, njs_value_t *value, } 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_object_prop_t *prop, njs_value_t *value, } 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_object_prop_t *prop, njs_value_t *value, 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_object_prop_t *prop, njs_value_t *value, /* 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_object_prop_t *prop, njs_value_t *value, } 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 *retval, unsigned mask) 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 --git a/external/njs_xml_module.c b/external/njs_xml_module.c index 7fbc21a8..86c896c0 100644 --- a/external/njs_xml_module.c +++ b/external/njs_xml_module.c @@ -584,8 +584,8 @@ njs_xml_node_ext_prop_keys(njs_vm_t *vm, njs_value_t *value, njs_value_t *keys) 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, njs_value_t *value, njs_value_t *keys) 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, njs_value_t *value, njs_value_t *keys) 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, njs_value_t *value, njs_value_t *keys) 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, njs_value_t *value, njs_value_t *keys) 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 --git a/nginx/ngx_http_js_module.c b/nginx/ngx_http_js_module.c index d280ca0f..fd3c1742 100644 --- a/nginx/ngx_http_js_module.c +++ b/nginx/ngx_http_js_module.c @@ -1144,8 +1144,8 @@ ngx_http_js_body_filter(ngx_http_request_t *r, ngx_chain_t *in) 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, njs_value_t *value, njs_value_t *keys, 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, njs_object_prop_t *prop, 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, njs_object_prop_t *prop, 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, ngx_http_request_t *r, 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, ngx_http_request_t *r, 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, ngx_http_request_t *r, 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 *vm, njs_value_t *value, 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 *vm, njs_value_t *value, 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_t *vm, njs_object_prop_t *prop, 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_vm_t *vm, njs_object_prop_t *prop, 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; + return njs_vm_value_string_create(vm, retval, (*hh)->value.data, + (*hh)->value.len); } - end = p + 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); + } - for (i = 0; /* void */ ; i++) { + ret = njs_vm_value_string_create_chb(vm, retval, &chain); - p = ngx_copy(p, hh[i]->value.data, hh[i]->value.len); + njs_chb_destroy(&chain); - if (p == end) { - break; - } - - *p++ = sep; - } - - return NJS_OK; + return ret; } #else static njs_int_t @@ -3889,9 +3874,9 @@ ngx_http_js_header_generic(njs_vm_t *vm, ngx_http_request_t *r, 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, ngx_http_request_t *r, 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, ngx_http_request_t *r, } if ((*ph)->next == NULL || flags & NJS_HEADER_SINGLE) { - return njs_vm_value_string_set(vm, retval, (*ph)->value.data, - (*ph)->value.len); + return njs_vm_value_string_create(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; - } + 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); + njs_chb_append(&chain, h->value.data, h->value.len); + njs_chb_append(&chain, &sep, 1); + njs_chb_append_literal(&chain, " "); + } - if (h->next == NULL) { - break; - } + ret = njs_vm_value_string_create_chb(vm, retval, &chain); - *p++ = sep; *p++ = ' '; - } + njs_chb_destroy(&chain); - return NJS_OK; + 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, ngx_http_request_t *r, { 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, ngx_http_request_t *r, 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 --git a/nginx/ngx_js.c b/nginx/ngx_js.c index d1719951..aa5e71cc 100644 --- a/nginx/ngx_js.c +++ b/nginx/ngx_js.c @@ -668,7 +668,7 @@ ngx_js_ext_string(njs_vm_t *vm, njs_object_prop_t *prop, njs_value_t *value, 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 --git a/nginx/ngx_js.h b/nginx/ngx_js.h index a84058f3..189d4878 100644 --- a/nginx/ngx_js.h +++ b/nginx/ngx_js.h @@ -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 --git a/nginx/ngx_js_fetch.c b/nginx/ngx_js_fetch.c index b95f6d55..feef457c 100644 --- a/nginx/ngx_js_fetch.c +++ b/nginx/ngx_js_fetch.c @@ -3237,8 +3237,8 @@ ngx_headers_js_get(njs_vm_t *vm, njs_value_t *value, njs_str_t *name, 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_value_t *value, njs_str_t *name, 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, njs_value_t *value, njs_value_t *keys) 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, njs_value_t *args, njs_uint_t nargs, 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, njs_value_t *args, 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 *vm, njs_object_prop_t *prop, 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, njs_object_prop_t *prop, 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_js_entry_t *entries, njs_int_t value, 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 --git a/nginx/ngx_js_shared_dict.c b/nginx/ngx_js_shared_dict.c index 3c94bd58..c40a6dbd 100644 --- a/nginx/ngx_js_shared_dict.c +++ b/nginx/ngx_js_shared_dict.c @@ -423,8 +423,8 @@ njs_js_ext_global_shared_keys(njs_vm_t *vm, njs_value_t *unused, 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, njs_value_t *args, njs_uint_t nargs, 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 *vm, njs_value_t *args, njs_uint_t nargs, 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, njs_object_prop_t *prop, 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, njs_object_prop_t *prop, 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 *vm, ngx_js_dict_t *dict, 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 --git a/nginx/ngx_stream_js_module.c b/nginx/ngx_stream_js_module.c index b8b29a56..23c288bc 100644 --- a/nginx/ngx_stream_js_module.c +++ b/nginx/ngx_stream_js_module.c @@ -1241,8 +1241,8 @@ ngx_stream_js_ext_get_remote_address(njs_vm_t *vm, 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 --git a/src/njs.h b/src/njs.h index 3a6bd7fc..2e16ce4e 100644 --- a/src/njs.h +++ b/src/njs.h @@ -400,14 +400,6 @@ NJS_EXPORT njs_int_t njs_value_to_integer(njs_vm_t *vm, njs_value_t *value, /* 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 --git a/src/njs_string.c b/src/njs_string.c index 2549491a..702d652d 100644 --- a/src/njs_string.c +++ b/src/njs_string.c @@ -3152,7 +3152,7 @@ njs_string_get_substitution(njs_vm_t *vm, njs_value_t *matched, 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 --git a/src/njs_vm.c b/src/njs_vm.c index f9c798aa..9e4125f8 100644 --- a/src/njs_vm.c +++ b/src/njs_vm.c @@ -945,14 +945,6 @@ njs_value_string_get(njs_value_t *value, njs_str_t *dst) } -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, njs_value_t *value, const u_char *start, } -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_value_t *value, const njs_str_t *prop, 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_value_t *value, const njs_str_t *prop, 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 --git a/src/test/njs_benchmark.c b/src/test/njs_benchmark.c index d22ccae3..ac684b8f 100644 --- a/src/test/njs_benchmark.c +++ b/src/test/njs_benchmark.c @@ -188,10 +188,10 @@ njs_benchmark_test(njs_vm_t *parent, njs_opts_t *opts, njs_value_t *report, 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 --git a/src/test/njs_externals_test.c b/src/test/njs_externals_test.c index f9fa6dbf..7dcad90b 100644 --- a/src/test/njs_externals_test.c +++ b/src/test/njs_externals_test.c @@ -158,7 +158,7 @@ njs_unit_test_r_uri(njs_vm_t *vm, njs_object_prop_t *prop, 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_object_prop_t *prop, 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_object_prop_t *self, 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); - p = njs_vm_value_string_alloc(vm, retval, size); - if (p == NULL) { - return NJS_ERROR; - } + njs_chb_append(&chain, h.start, h.length); + njs_chb_append(&chain, (u_char *) "|АБВ", njs_length("|АБВ")); - p = njs_cpymem(p, h.start, h.length); - *p++ = '|'; - memcpy(p, "АБВ", njs_length("АБВ")); - return NJS_OK; + ret = njs_vm_value_string_create_chb(vm, retval, &chain); + + 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, njs_value_t *value, njs_value_t *keys) return NJS_ERROR; } - (void) njs_vm_value_string_set(vm, push, k, 2); + (void) njs_vm_value_string_create(vm, push, k, 2); k[1]++; } @@ -385,7 +383,8 @@ njs_unit_test_r_method(njs_vm_t *vm, njs_value_t *args, njs_uint_t nargs, ret = njs_vm_value_to_bytes(vm, &s, njs_arg(args, nargs, 1)); if (ret == NJS_OK && s.length == 3 && memcmp(s.start, "YES", 3) == 0) { - return njs_vm_value_string_set(vm, retval, r->uri.start, r->uri.length); + return njs_vm_value_string_create(vm, retval, r->uri.start, + r->uri.length); } njs_set_undefined(retval); @@ -638,7 +637,8 @@ static njs_int_t njs_unit_test_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 *) "ExternalError", 13); + return njs_vm_value_string_create(vm, retval, (u_char *) "ExternalError", + 13); } @@ -646,7 +646,7 @@ static njs_int_t njs_unit_test_error_message(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 *) "", 0); + return njs_vm_value_string_create(vm, retval, (u_char *) "", 0); } diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 2fa7e01f..e048708b 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -22169,13 +22169,13 @@ static njs_unit_test_t njs_externals_test[] = njs_str("АБВαβγ") }, { njs_str("var a = $r.uri; a +' '+ a.length +' '+ a"), - njs_str("АБВ 6 АБВ") }, + njs_str("АБВ 3 АБВ") }, { njs_str("$r.uri = 'αβγ'; var a = $r.uri; a.length +' '+ a"), - njs_str("6 αβγ") }, + njs_str("3 αβγ") }, { njs_str("$r.uri.length +' '+ $r.uri"), - njs_str("6 АБВ") }, + njs_str("3 АБВ") }, { njs_str("var t; " "switch ($r3.uri) {" @@ -22187,8 +22187,8 @@ static njs_unit_test_t njs_externals_test[] = "}; t"), njs_str("A") }, - { njs_str("$r.uri = $r.uri.substr(2); $r.uri.length +' '+ $r.uri"), - njs_str("4 БВ") }, + { njs_str("$r.uri = $r.uri.substr(1); $r.uri.length +' '+ $r.uri"), + njs_str("2 БВ") }, { njs_str("'' + $r.props.a + $r2.props.a + $r.props.a"), njs_str("121") }, @@ -22263,13 +22263,13 @@ static njs_unit_test_t njs_externals_test[] = njs_str("undefined") }, { njs_str("var a = $r.host; a +' '+ a.length +' '+ a"), - njs_str("АБВГДЕЁЖЗИЙ 22 АБВГДЕЁЖЗИЙ") }, + njs_str("АБВГДЕЁЖЗИЙ 11 АБВГДЕЁЖЗИЙ") }, - { njs_str("var a = $r.host; a.substr(2, 2)"), + { njs_str("var a = $r.host; a.substr(1, 1)"), njs_str("Б") }, { njs_str("var a = $r.header['User-Agent']; a +' '+ a.length +' '+ a"), - njs_str("User-Agent|АБВ 17 User-Agent|АБВ") }, + njs_str("User-Agent|АБВ 14 User-Agent|АБВ") }, { njs_str("var a='', p;" "for (p in $r.header) { a += p +':'+ $r.header[p] +',' }" @@ -24141,10 +24141,10 @@ njs_vm_object_alloc_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat) njs_value_number_set(njs_value_arg(&args[0]), 1); njs_value_boolean_set(njs_value_arg(&args[0]), 0); - (void) njs_vm_value_string_set(vm, njs_value_arg(&num_key), - (u_char *) "num", 3); - (void) njs_vm_value_string_set(vm, njs_value_arg(&bool_key), - (u_char *) "bool", 4); + (void) njs_vm_value_string_create(vm, njs_value_arg(&num_key), + (u_char *) "num", 3); + (void) njs_vm_value_string_create(vm, njs_value_arg(&bool_key), + (u_char *) "bool", 4); ret = njs_vm_object_alloc(vm, njs_value_arg(&obj), NULL); if (ret != NJS_OK) { @@ -24486,9 +24486,9 @@ njs_string_to_index_test(njs_vm_t *vm, njs_opts_t *opts, njs_stat_t *stat) }; for (i = 0; i < njs_nitems(tests); i++) { - (void) njs_vm_value_string_set(vm, njs_value_arg(&input), - tests[i].value.start, - tests[i].value.length); + (void) njs_vm_value_string_create(vm, njs_value_arg(&input), + tests[i].value.start, + tests[i].value.length); num = njs_string_to_index(njs_value_arg(&input)); njs_value_number_set(njs_value_arg(&value), num);