details: http://hg.nginx.org/njs/rev/ea220019d249 branches: changeset: 512:ea220019d249 user: Dmitry Volyntsev <xei...@nginx.com> date: Thu Apr 26 20:22:04 2018 +0300 description: Fixed njs_vm_external_bind().
Previously, it could result in misaligned values being returned. diffstat: njs/njs_builtin.c | 2 +- njs/njs_extern.c | 7 ++++--- njs/njs_extern.h | 2 +- njs/test/njs_unit_test.c | 16 ++++++---------- 4 files changed, 12 insertions(+), 15 deletions(-) diffs (106 lines): diff -r 5776906c23da -r ea220019d249 njs/njs_builtin.c --- a/njs/njs_builtin.c Thu Apr 26 20:21:46 2018 +0300 +++ b/njs/njs_builtin.c Thu Apr 26 20:22:04 2018 +0300 @@ -675,7 +675,7 @@ njs_builtin_completions(njs_vm_t *vm, si break; } - ext_proto = ev->value->external.proto; + ext_proto = ev->value.external.proto; nxt_lvlhsh_each_init(&lhe_prop, &njs_extern_hash_proto); diff -r 5776906c23da -r ea220019d249 njs/njs_extern.c --- a/njs/njs_extern.c Thu Apr 26 20:21:46 2018 +0300 +++ b/njs/njs_extern.c Thu Apr 26 20:22:04 2018 +0300 @@ -210,13 +210,14 @@ njs_vm_external_bind(njs_vm_t *vm, const return NXT_ERROR; } - ev = nxt_mem_cache_alloc(vm->mem_cache_pool, sizeof(njs_extern_value_t)); + ev = nxt_mem_cache_align(vm->mem_cache_pool, sizeof(njs_value_t), + sizeof(njs_extern_value_t)); if (nxt_slow_path(ev == NULL)) { return NXT_ERROR; } + ev->value = *value; ev->name = *var_name; - ev->value = value; lhq.key = *var_name; lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length); @@ -246,7 +247,7 @@ njs_parser_external(njs_vm_t *vm, njs_pa if (nxt_lvlhsh_find(&vm->externals_hash, &lhq) == NXT_OK) { ev = (njs_extern_value_t *) lhq.value; - return ev->value; + return &ev->value; } return NULL; diff -r 5776906c23da -r ea220019d249 njs/njs_extern.h --- a/njs/njs_extern.h Thu Apr 26 20:21:46 2018 +0300 +++ b/njs/njs_extern.h Thu Apr 26 20:22:04 2018 +0300 @@ -33,8 +33,8 @@ struct njs_extern_s { typedef struct { + njs_value_t value; nxt_str_t name; - njs_value_t *value; } njs_extern_value_t; diff -r 5776906c23da -r ea220019d249 njs/test/njs_unit_test.c --- a/njs/test/njs_unit_test.c Thu Apr 26 20:21:46 2018 +0300 +++ b/njs/test/njs_unit_test.c Thu Apr 26 20:22:04 2018 +0300 @@ -9384,6 +9384,8 @@ typedef struct { uint32_t a; nxt_mem_cache_pool_t *mem_cache_pool; const njs_extern_t *proto; + + njs_opaque_value_t value; } njs_unit_test_req_t; @@ -9719,7 +9721,6 @@ njs_externals_init(njs_vm_t *vm) nxt_int_t ret; nxt_uint_t i; const njs_extern_t *proto; - njs_opaque_value_t *values; njs_unit_test_req_t *requests; proto = njs_vm_external_prototype(vm, &nxt_test_external[0]); @@ -9728,13 +9729,6 @@ njs_externals_init(njs_vm_t *vm) return NXT_ERROR; } - values = nxt_mem_cache_zalloc(vm->mem_cache_pool, - nxt_nitems(nxt_test_requests) - * sizeof(njs_opaque_value_t)); - if (values == NULL) { - return NXT_ERROR; - } - requests = nxt_mem_cache_zalloc(vm->mem_cache_pool, nxt_nitems(nxt_test_requests) * sizeof(njs_unit_test_req_t)); @@ -9748,13 +9742,15 @@ njs_externals_init(njs_vm_t *vm) requests[i].mem_cache_pool = vm->mem_cache_pool; requests[i].proto = proto; - ret = njs_vm_external_create(vm, &values[i], proto, &requests[i]); + ret = njs_vm_external_create(vm, &requests[i].value, proto, + &requests[i]); if (ret != NXT_OK) { printf("njs_vm_external_create() failed\n"); return NXT_ERROR; } - ret = njs_vm_external_bind(vm, &nxt_test_requests[i].name, &values[i]); + ret = njs_vm_external_bind(vm, &nxt_test_requests[i].name, + &requests[i].value); if (ret != NXT_OK) { printf("njs_vm_external_bind() failed\n"); return NXT_ERROR; _______________________________________________ nginx-devel mailing list nginx-devel@nginx.org http://mailman.nginx.org/mailman/listinfo/nginx-devel