From 4b53dd5c618801934f46f7c2ebdb0b4f887e3f8c Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Fri, 19 Jun 2020 01:35:38 -0700 Subject: [PATCH] Fixed issue that could cause stack overflow --- meshcore/agentcore.c | 16 +++++++--------- microscript/ILibDuktape_fs.c | 26 ++++++++++++++++---------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c index 49545ca..2f18069 100644 --- a/meshcore/agentcore.c +++ b/meshcore/agentcore.c @@ -4666,25 +4666,23 @@ duk_ret_t MeshAgent_ScriptMode_ZipSink2(duk_context *ctx) { duk_array_pop(ctx, -1); // [array][obj] duk_get_prop_string(ctx, -1, "name"); // [array][obj][name] -#ifdef WIN32 duk_string_split(ctx, -1, "\\"); // [array][obj][name][tokens] -#else - duk_string_split(ctx, -1, "/"); -#endif duk_array_pop(ctx, -1); // [array][obj][name][tokens][filename] - duk_string_endsWith(ctx, -1, ".js"); // [array][obj][name][tokens][filename][boolean] + duk_string_split(ctx, -1, "/"); // [array][obj][name][tokens][filename][tokens] + duk_array_pop(ctx, -1); // [array][obj][name][tokens][filename][tokens][filename] + duk_string_endsWith(ctx, -1, ".js"); // [array][obj][name][tokens][filename][tokens][filename][boolean] if (duk_get_boolean(ctx, -1)) { // This is a JS module if (run != NULL && found == 0) { - duk_push_string(ctx, run); // [array][obj][name][tokens][filename][boolean][run] + duk_push_string(ctx, run); // [array][obj][name][tokens][filename][tokens][filename][boolean][run] if (duk_equals(ctx, -3, -1) == 1) { // This is the script to run - duk_push_heap_stash(ctx); // [array][obj][name][tokens][filename][boolean][run][stash] - duk_get_prop_string(ctx, -7, "buffer"); // [array][obj][name][tokens][filename][boolean][run][stash][buffer] - duk_put_prop_string(ctx, -2, "_script"); // [array][obj][name][tokens][filename][boolean][run][stash] + duk_push_heap_stash(ctx); // [array][obj][name][tokens][filename][tokens][filename][boolean][run][stash] + duk_get_prop_string(ctx, -9, "buffer"); // [array][obj][name][tokens][filename][tokens][filename][boolean][run][stash][buffer] + duk_put_prop_string(ctx, -2, "_script"); // [array][obj][name][tokens][filename][tokens][filename][boolean][run][stash] duk_swap_top(ctx, -2); // [array][obj][name][tokens][filename][boolean][stash][run] duk_put_prop_string(ctx, -2, "_scriptName");// [array][obj][name][tokens][filename][boolean][stash] found = 1; diff --git a/microscript/ILibDuktape_fs.c b/microscript/ILibDuktape_fs.c index aea2966..aab947b 100644 --- a/microscript/ILibDuktape_fs.c +++ b/microscript/ILibDuktape_fs.c @@ -753,11 +753,12 @@ void ILibDuktape_fs_buffer_fd_read(duk_context *ctx, void ** args, int argsLen) duk_get_prop_string(ctx, -1, "func"); // [fs][array][obj][func] duk_eval_string(ctx, "require('fs');"); // [fs][array][obj][func][this] - duk_push_int(ctx, 0); // [fs][array][obj][func][this][err] + duk_get_prop_string(ctx, -3, "err"); // [fs][array][obj][func][this][err] duk_get_prop_string(ctx, -4, "bytesRead"); // [fs][array][obj][func][this][err][bytesRead] duk_get_prop_string(ctx, -5, "buffer"); // [fs][array][obj][func][this][err][bytesRead][buffer] - duk_remove(ctx, -6); // [fs][array][func][this][err][bytesRead][buffer] - if (duk_pcall_method(ctx, 3) != 0) + duk_get_prop_string(ctx, -6, "options"); // [fs][array][obj][func][this][err][bytesRead][buffer][options] + duk_remove(ctx, -7); // [fs][array][func][this][err][bytesRead][buffer][options] + if (duk_pcall_method(ctx, 4) != 0) { ILibDuktape_Process_UncaughtExceptionEx(ctx, "fs.read.bufferFD.callback() "); } @@ -829,6 +830,7 @@ duk_ret_t ILibDuktape_fs_read(duk_context *ctx) duk_dup(ctx, 2); duk_put_prop_string(ctx, -2, "func"); duk_push_int(ctx, bytesRead); duk_put_prop_string(ctx, -2, "bytesRead"); duk_get_prop_string(ctx, 1, "buffer"); duk_put_prop_string(ctx, -2, "buffer"); + duk_push_int(ctx, 0); duk_put_prop_string(ctx, -2, "err"); duk_array_push(ctx, -2); // [bufferDescriptor][buffer][fs][array] ILibDuktape_Immediate(ctx, NULL, 0, ILibDuktape_fs_buffer_fd_read); return(0); @@ -886,13 +888,17 @@ duk_ret_t ILibDuktape_fs_read(duk_context *ctx) { // Completed int errStatus = bytesRead >= 0 ? 0 : errno; - duk_dup(ctx, 2); // [func] - duk_push_this(ctx); // [func][this] - duk_push_int(ctx, errStatus); // [func][this][err/status] - duk_push_int(ctx, bytesRead); // [func][this][err/status][bytesRead] - duk_get_prop_string(ctx, 1, "buffer"); // [func][this][err/status][bytesRead][buffer] - duk_dup(ctx, 3); // [func][this][err/status][bytesRead][buffer][options] - duk_call_method(ctx, 4); + + duk_push_this(ctx); // [fs] + duk_get_prop_string(ctx, -1, FS_BUFFER_DESCRIPTOR_PENDING); // [fs][array] + duk_push_object(ctx); // [fs][array][object] + duk_dup(ctx, 2); duk_put_prop_string(ctx, -2, "func"); + duk_push_int(ctx, bytesRead); duk_put_prop_string(ctx, -2, "bytesRead"); + duk_get_prop_string(ctx, 1, "buffer"); duk_put_prop_string(ctx, -2, "buffer"); + duk_push_int(ctx, errStatus); duk_put_prop_string(ctx, -2, "err"); + duk_dup(ctx, 3); duk_put_prop_string(ctx, -2, "options"); + duk_array_push(ctx, -2); // [fs][array] + ILibDuktape_Immediate(ctx, NULL, 0, ILibDuktape_fs_buffer_fd_read); return(0); }