]> git.kaiwu.me - njs.git/commitdiff
Fixed sharing of externals between main and cloned VMs.
authorDmitry Volyntsev <xeioex@nginx.com>
Mon, 11 Nov 2019 12:37:08 +0000 (15:37 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Mon, 11 Nov 2019 12:37:08 +0000 (15:37 +0300)
The issue was introduced in 7e7d0dac4572.

This closes #245 issue on Github.

src/njs_extern.c
src/test/njs_unit_test.c

index af33d7cbdbcd693170051ab34bc219f13fe62dcb..83dc3c537baa6c8bc0b470e00d744b9a67189adb 100644 (file)
@@ -172,22 +172,33 @@ njs_vm_external_create(njs_vm_t *vm, njs_value_t *ext_val,
     const njs_extern_t *proto, njs_external_ptr_t object)
 {
     void       *obj;
+    uint32_t   n;
     njs_arr_t  *externals;
 
     if (njs_slow_path(proto == NULL)) {
         return NJS_ERROR;
     }
 
-    if (njs_slow_path(vm->external_objects == NULL)) {
-        externals = njs_arr_create(vm->mem_pool, 4, sizeof(void *));
+    if (vm->external_objects->mem_pool != vm->mem_pool) {
+
+        /* Making a local copy of externals in shared VM. */
+
+        n = vm->external_objects->items;
+
+        externals = njs_arr_create(vm->mem_pool, n + 4, sizeof(void *));
         if (njs_slow_path(externals == NULL)) {
             return NJS_ERROR;
         }
 
+        if (n > 0) {
+            memcpy(externals->start, vm->external_objects->start,
+                   n * sizeof(void *));
+            externals->items = n;
+        }
+
         vm->external_objects = externals;
     }
 
-
     obj = njs_arr_add(vm->external_objects);
     if (njs_slow_path(obj == NULL)) {
         return NJS_ERROR;
index 5c29adfdde503066ae170e82a56eaf5a3526675f..40c86a36a066648cbe280fa3292c99853099512e 100644 (file)
@@ -14694,6 +14694,9 @@ static njs_unit_test_t  njs_shared_test[] =
 
     { njs_str("isNaN(function(){})"),
       njs_str("true") },
+
+    { njs_str("var r; for (var i = 0; i < 2**10; i++) {r = $r.create('XXX').uri;}"),
+      njs_str("undefined") },
 };