1
0
mirror of https://github.com/Ylianst/MeshAgent synced 2025-12-15 07:43:50 +00:00

Fixed Windows IPC Read, to unroll completion callback, before dispatching

Fixed edge case bug where stack wasn't popped correctly for IPC Write
This commit is contained in:
Bryan Roe
2019-12-05 14:45:07 -08:00
parent 8356cbf190
commit 4a2bc80d2e

View File

@@ -91,6 +91,8 @@ typedef struct ILibDuktape_net_WindowsIPC
OVERLAPPED overlapped;
ILibDuktape_DuplexStream *ds;
ULONG_PTR _reserved[5];
int processingRead;
char *buffer;
int bufferLength;
@@ -818,10 +820,14 @@ int ILibDuktape_net_server_IPC_unshiftSink(ILibDuktape_DuplexStream *sender, int
winIPC->unshiftedBytes = unshiftBytes;
return(unshiftBytes);
}
void ILibDuktape_net_server_IPC_readsink(ILibProcessPipe_Pipe sender, void *user, DWORD dwErrorCode, char *buffer, int bufferLen)
void ILibDuktape_net_server_IPC_readsink_safe(void *chain, void *user)
{
ILibDuktape_net_WindowsIPC *winIPC = (ILibDuktape_net_WindowsIPC*)user;
if (!ILibMemory_CanaryOK(user)) { return; }
ILibDuktape_net_WindowsIPC *winIPC = (ILibDuktape_net_WindowsIPC*)user;
ILibProcessPipe_Pipe sender = (ILibProcessPipe_Pipe)winIPC->_reserved[0];
DWORD dwErrorCode = (DWORD)winIPC->_reserved[2];
char *buffer = (char*)winIPC->_reserved[3];
int bufferLen = (int)winIPC->_reserved[4];
if (dwErrorCode == 0)
{
@@ -852,7 +858,7 @@ void ILibDuktape_net_server_IPC_readsink(ILibProcessPipe_Pipe sender, void *user
duk_get_prop_string(ctx, -1, ILibDuktape_SERVER2LISTENOPTIONS); // [listen][this][options]
duk_pcall_method(ctx, 1); // [ret]
}
else if(Duktape_GetBooleanProperty(ctx, -1, ILibDuktape_net_server_closed_needEmit, 0) != 0)
else if (Duktape_GetBooleanProperty(ctx, -1, ILibDuktape_net_server_closed_needEmit, 0) != 0)
{
ILibDuktape_EventEmitter_SetupEmit(ctx, winIPC->mServer, "close"); // [emit][this][closed]
duk_pcall_method(ctx, 1); // [ret]
@@ -861,6 +867,19 @@ void ILibDuktape_net_server_IPC_readsink(ILibProcessPipe_Pipe sender, void *user
}
}
}
void ILibDuktape_net_server_IPC_readsink(ILibProcessPipe_Pipe sender, void *user, DWORD dwErrorCode, char *buffer, int bufferLen)
{
ILibDuktape_net_WindowsIPC *winIPC = (ILibDuktape_net_WindowsIPC*)user;
if (!ILibMemory_CanaryOK(user)) { return; }
winIPC->_reserved[0] = (ULONG_PTR)sender;
winIPC->_reserved[1] = (ULONG_PTR)user;
winIPC->_reserved[2] = (ULONG_PTR)dwErrorCode;
winIPC->_reserved[3] = (ULONG_PTR)buffer;
winIPC->_reserved[4] = (ULONG_PTR)bufferLen;
ILibChain_RunOnMicrostackThreadEx(Duktape_GetChain(winIPC->ctx), ILibDuktape_net_server_IPC_readsink_safe, winIPC);
}
void ILibDuktape_net_server_IPC_PauseSink(ILibDuktape_DuplexStream *sender, void *user)
{
// No-OP, becuase all we need to so is set Paused flag, which is already the case when we get here
@@ -965,6 +984,7 @@ void ILibDuktape_net_server_IPC_WriteCompletionEvent(ILibProcessPipe_Pipe sender
else
{
// No more pending writes, so we can emit drain
duk_set_top(winIPC->ctx, top); // ...
ILibDuktape_DuplexStream_Ready(winIPC->ds);
}
}