]> git.kaiwu.me - njs.git/commitdiff
Fixed njs_vm_external_bind().
authorDmitry Volyntsev <xeioex@nginx.com>
Thu, 26 Apr 2018 17:22:04 +0000 (20:22 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Thu, 26 Apr 2018 17:22:04 +0000 (20:22 +0300)
Previously, it could result in misaligned values being returned.

njs/njs_builtin.c
njs/njs_extern.c
njs/njs_extern.h
njs/test/njs_unit_test.c

index eab304e224b93702b2a52127134127d424d71fb5..31a97eb521d9243d52715a86b7cd89f7c9f09106 100644 (file)
@@ -675,7 +675,7 @@ njs_builtin_completions(njs_vm_t *vm, size_t *size, nxt_str_t *completions)
             break;
         }
 
-        ext_proto = ev->value->external.proto;
+        ext_proto = ev->value.external.proto;
 
         nxt_lvlhsh_each_init(&lhe_prop, &njs_extern_hash_proto);
 
index b1fac6fc847bd67f93ad5c71a40025614c1b9fdd..21602645e6eb86e50a4f4fc72d444c2f972c8e83 100644 (file)
@@ -210,13 +210,14 @@ njs_vm_external_bind(njs_vm_t *vm, const nxt_str_t *var_name,
         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_parser_t *parser)
 
     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;
index 4db49dbc9db8c07ea0033ff75acb7827335e8f76..1df7b73f1ef1a6d1f2b3627573d1befa60777654 100644 (file)
@@ -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;
 
 
index b921bbd3b098396ab662372cb3b76354fee39ba1..3864772ba9bc6e73eef90d0ed98c7246f50aa839 100644 (file)
@@ -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;