1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-16 08:13:30 +00:00

Fixed issue that could cause stack overflow

This commit is contained in:
Bryan Roe
2020-06-19 01:35:38 -07:00
parent 885c6de72a
commit 4b53dd5c61
2 changed files with 23 additions and 19 deletions

View File

@@ -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;

View File

@@ -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);
}