From b1e00359ba663d8fd9d931833e162e5a9f604166 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Mon, 11 Nov 2019 15:37:08 +0300 Subject: [PATCH] Fixed sharing of externals between main and cloned VMs. The issue was introduced in 7e7d0dac4572. This closes #245 issue on Github. --- src/njs_extern.c | 17 ++++++++++++++--- src/test/njs_unit_test.c | 3 +++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/njs_extern.c b/src/njs_extern.c index af33d7cb..83dc3c53 100644 --- a/src/njs_extern.c +++ b/src/njs_extern.c @@ -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; diff --git a/src/test/njs_unit_test.c b/src/test/njs_unit_test.c index 5c29adfd..40c86a36 100644 --- a/src/test/njs_unit_test.c +++ b/src/test/njs_unit_test.c @@ -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") }, }; -- 2.47.3