Fix leak when interpreter exits due to exception

Fixes: https://github.com/quickjs-ng/quickjs/issues/720
This commit is contained in:
Saúl Ibarra Corretgé 2024-11-25 08:49:25 +01:00
parent 9631492534
commit f7f70fc579
8 changed files with 25 additions and 6 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

2
qjs.c
View file

@ -36,6 +36,7 @@
#include <time.h>
#include "cutils.h"
#include "quickjs.h"
#include "quickjs-libc.h"
#ifdef QJS_USE_MIMALLOC
@ -556,6 +557,7 @@ int main(int argc, char **argv)
ret = js_std_loop(ctx);
if (!JS_IsUndefined(ret)) {
js_std_dump_error1(ctx, ret);
JS_FreeValue(ctx, ret);
goto fail;
}
}

14
qjsc.c
View file

@ -314,19 +314,27 @@ static void compile_file(JSContext *ctx, FILE *fo,
static const char main_c_template1[] =
"int main(int argc, char **argv)\n"
"{\n"
" int r;\n"
" JSValue ret;\n"
" JSRuntime *rt;\n"
" JSContext *ctx;\n"
" r = 0;\n"
" rt = JS_NewRuntime();\n"
" js_std_set_worker_new_context_func(JS_NewCustomContext);\n"
" js_std_init_handlers(rt);\n"
;
static const char main_c_template2[] =
" js_std_loop(ctx);\n"
" ret = js_std_loop(ctx);\n"
" if (JS_IsException(ret)) {\n"
" js_std_dump_error1(ctx, ret);\n"
" r = 1;\n"
" }\n"
" JS_FreeValue(ctx, ret);\n"
" JS_FreeContext(ctx);\n"
" js_std_free_handlers(rt);\n"
" JS_FreeRuntime(rt);\n"
" return 0;\n"
" return r;\n"
"}\n";
#define PROG_NAME "qjsc"
@ -375,7 +383,7 @@ int main(int argc, char **argv)
stack_size = 0;
memset(&dynamic_module_list, 0, sizeof(dynamic_module_list));
/* add system modules */
namelist_add(&cmodule_list, "qjs:std", "std", 0);
namelist_add(&cmodule_list, "qjs:os", "os", 0);

View file

@ -3499,7 +3499,7 @@ static void *worker_func(void *opaque)
js_std_dump_error(ctx);
JS_FreeValue(ctx, val);
js_std_loop(ctx);
JS_FreeValue(ctx, js_std_loop(ctx));
JS_FreeContext(ctx);
js_std_free_handlers(rt);
@ -4137,6 +4137,7 @@ JSValue js_std_loop(JSContext *ctx)
JSRuntime *rt = JS_GetRuntime(ctx);
JSThreadState *ts = js_get_thread_state(rt);
JSContext *ctx1;
JSValue ret;
int err;
for(;;) {
@ -4156,7 +4157,9 @@ JSValue js_std_loop(JSContext *ctx)
break;
}
done:
return ts->exc;
ret = ts->exc;
ts->exc = JS_UNDEFINED;
return ret;
}
/* Wait for a promise and execute pending jobs while waiting for

View file

@ -45,6 +45,7 @@ typedef pthread_t js_thread_t;
#include "cutils.h"
#include "list.h"
#include "quickjs.h"
#include "quickjs-c-atomics.h"
#include "quickjs-libc.h"
@ -1554,7 +1555,12 @@ static int eval_buf(JSContext *ctx, const char *buf, size_t buf_len,
}
if (local) {
js_std_loop(ctx);
JSValue val = js_std_loop(ctx);
if (JS_IsException(val)) {
js_std_dump_error1(ctx, val);
ret = -1;
}
JS_FreeValue(ctx, val);
}
JS_FreeCString(ctx, error_name);