details:   
https://github.com/nginx/njs/commit/c367f7e2fd2bf0147e950131f4b7887d178110f6
branches:  master
commit:    c367f7e2fd2bf0147e950131f4b7887d178110f6
user:      Dmitry Volyntsev <xei...@nginx.com>
date:      Tue, 1 Jul 2025 23:01:57 -0700
description:
Modules: fixed qjs engine after bellard/quickjs@458c34d2.

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 | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/nginx/ngx_js.c b/nginx/ngx_js.c
index 448073b9..01d4bb2a 100644
--- a/nginx/ngx_js.c
+++ b/nginx/ngx_js.c
@@ -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) {
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel

Reply via email to