Mercurial > njs
changeset 2562:f114be6952f9
Fixed segfault at error message in njs_property_query().
The issue was introduced in b28e50b1 (0.9.0).
This closes #918 issue on Github.
| author | Vadim Zhestikov <v.zhestikov@f5.com> |
|---|---|
| date | Wed, 28 May 2025 09:16:38 -0700 |
| parents | 96ec59c0cfc4 |
| children | 742e5ffd8f81 |
| files | src/njs_generator.c src/njs_lexer.h src/njs_object.h src/njs_parser.c src/njs_value.c src/njs_variable.c src/test/njs_unit_test.c |
| diffstat | 7 files changed, 12 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- a/src/njs_generator.c Wed May 21 17:10:15 2025 -0700 +++ b/src/njs_generator.c Wed May 28 09:16:38 2025 -0700 @@ -5491,7 +5491,7 @@ ref_err->type = NJS_OBJ_TYPE_REF_ERROR; - njs_lexer_entry(vm, node->u.reference.atom_id, &entry); + njs_atom_string_get(vm, node->u.reference.atom_id, &entry); return njs_name_copy(vm, &ref_err->u.name, &entry); }
--- a/src/njs_lexer.h Wed May 21 17:10:15 2025 -0700 +++ b/src/njs_lexer.h Wed May 28 09:16:38 2025 -0700 @@ -288,16 +288,6 @@ njs_int_t njs_lexer_keywords(njs_arr_t *array); -njs_inline void -njs_lexer_entry(njs_vm_t *vm, uintptr_t atom_id, njs_str_t *entry) -{ - njs_value_t value; - - njs_atom_to_value(vm, &value, atom_id); - njs_string_get(vm, &value, entry); -} - - njs_inline njs_bool_t njs_lexer_token_is_keyword(njs_lexer_token_t *token) {
--- a/src/njs_object.h Wed May 21 17:10:15 2025 -0700 +++ b/src/njs_object.h Wed May 28 09:16:38 2025 -0700 @@ -241,18 +241,17 @@ } -njs_inline njs_int_t +njs_inline void njs_atom_string_get(njs_vm_t *vm, uint32_t atom_id, njs_str_t *str) { njs_value_t value; if (njs_atom_to_value(vm, &value, atom_id) != NJS_OK) { - return NJS_ERROR; + str->start = (u_char *) "unknown"; + str->length = njs_length("unknown"); } njs_key_string_get(vm, &value, str); - - return NJS_OK; }
--- a/src/njs_parser.c Wed May 21 17:10:15 2025 -0700 +++ b/src/njs_parser.c Wed May 28 09:16:38 2025 -0700 @@ -6702,7 +6702,6 @@ njs_int_t ret; njs_str_t str; uintptr_t atom_id; - njs_value_t entry; njs_parser_node_t *node; node = parser->node; @@ -6719,8 +6718,7 @@ atom_id = (uint32_t) (uintptr_t) parser->target; - njs_atom_to_value(parser->vm, &entry, atom_id); - njs_string_get(parser->vm, &entry, &str); + njs_atom_string_get(parser->vm, atom_id, &str); ret = njs_name_copy(parser->vm, &parser->node->name, &str); if (ret != NJS_OK) {
--- a/src/njs_value.c Wed May 21 17:10:15 2025 -0700 +++ b/src/njs_value.c Wed May 28 09:16:38 2025 -0700 @@ -560,7 +560,6 @@ { uint32_t index; njs_int_t ret; - njs_value_t key; njs_object_t *obj; njs_function_t *function; @@ -607,19 +606,9 @@ case NJS_UNDEFINED: case NJS_NULL: default: - ret = njs_atom_to_value(vm, &key, atom_id); - - if (njs_fast_path(ret == NJS_OK)) { - njs_string_get(vm, &key, &pq->lhq.key); - njs_type_error(vm, "cannot get property \"%V\" of %s", - &pq->lhq.key, njs_is_null(value) ? "null" - : "undefined"); - return NJS_ERROR; - } - - njs_type_error(vm, "cannot get property \"unknown\" of %s", - njs_is_null(value) ? "null" : "undefined"); - + njs_atom_string_get(vm, atom_id, &pq->lhq.key); + njs_type_error(vm, "cannot get property \"%V\" of %s", &pq->lhq.key, + njs_type_string(value->type)); return NJS_ERROR; }
--- a/src/njs_variable.c Wed May 21 17:10:15 2025 -0700 +++ b/src/njs_variable.c Wed May 28 09:16:38 2025 -0700 @@ -239,7 +239,7 @@ failed: - njs_lexer_entry(parser->vm, atom_id, &entry); + njs_atom_string_get(parser->vm, atom_id, &entry); njs_parser_syntax_error(parser, "\"%V\" has already been declared", &entry); return NULL;
--- a/src/test/njs_unit_test.c Wed May 21 17:10:15 2025 -0700 +++ b/src/test/njs_unit_test.c Wed May 28 09:16:38 2025 -0700 @@ -3923,6 +3923,9 @@ { njs_str("delete this !== true"), njs_str("false") }, + { njs_str("undefined[Symbol()]"), + njs_str("TypeError: cannot get property \"Symbol()\" of undefined") }, + /* Object shorthand methods. */ { njs_str("var o = {m(){}}; new o.m();"),
