]> git.kaiwu.me - njs.git/commitdiff
Modules: fixed qjs engine after bellard/quickjs@458c34d2.
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 2 Jul 2025 06:01:57 +0000 (23:01 -0700)
committerDmitry Volyntsev <xeioexception@gmail.com>
Wed, 2 Jul 2025 20:01:50 +0000 (13:01 -0700)
Object leaks:
       ADDRESS REFS SHRF          PROTO CONTENT
0x512000007fc0    1 [module]
nginx: quickjs.c:1967: JS_FreeRuntime: Assertion `list_empty(&rt->gc_obj_list)' failed.

After bellard/quickjs@458c34d2 modules are treated as GC objects and
tracked in rt->gc_obj_list. Intermediary module object loaded in
ngx_qjs_clone() using JS_ReadObject() needed to be freed for proper
ref_count accounting.

nginx/ngx_js.c

index 448073b984c3e83944d649707b376341f02183a1..01d4bb2a634f9e31a42e1d74dd5aa3e322ac15b7 100644 (file)
@@ -978,6 +978,11 @@ ngx_qjs_clone(ngx_js_ctx_t *ctx, ngx_js_loc_conf_t *cf, void *external)
                           "js load module exception: %V", &exception);
             goto destroy;
         }
+
+        if (i != length - 1) {
+            /* JS_EvalFunction() does JS_FreeValue(cx, rv) for the last rv. */
+            JS_FreeValue(cx, rv);
+        }
     }
 
     if (JS_ResolveModule(cx, rv) < 0) {