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:
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user