From 678ab7e687264c152259f78e92683dee89741ffe Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Fri, 11 Jan 2019 12:28:48 -0800 Subject: [PATCH] Updated so attempts to end an already end'ed stream is ignored --- microscript/ILibDuktape_ReadableStream.c | 13 +++++++++++-- microscript/ILibDuktape_ReadableStream.h | 1 + 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/microscript/ILibDuktape_ReadableStream.c b/microscript/ILibDuktape_ReadableStream.c index 80208ae..de7d36d 100644 --- a/microscript/ILibDuktape_ReadableStream.c +++ b/microscript/ILibDuktape_ReadableStream.c @@ -145,6 +145,12 @@ void ILibDuktape_readableStream_WriteData_OnData_ChainThread(void *chain, void * ILibDuktape_readableStream_bufferedData *data = (ILibDuktape_readableStream_bufferedData*)user; ILibDuktape_readableStream *stream = (ILibDuktape_readableStream*)data->Next; + if (!ILibMemory_CanaryOK(stream)) + { + free(data); + return; + } + stream->paused = 0; if (data->Reserved == 0) { @@ -328,10 +334,10 @@ int ILibDuktape_readableStream_WriteDataEx(ILibDuktape_readableStream *stream, i // We're running on the Chain Thread, so we can directly dispatch into JS switch (ILibDuktape_readableStream_WriteDataEx_Chain_Dispatch(stream, w->writableStream, buffer, bufferLen)) { - case 1: // Need to Pause + case 0: // Need to Pause needPause = 1; break; - case 2: // Complete + case 1: // Complete noContinue = 1; break; default: // NOP @@ -427,6 +433,9 @@ int ILibDuktape_readableStream_WriteEnd(ILibDuktape_readableStream *stream) } else { + if (stream->endRelayed != 0) { return(retVal); } + + stream->endRelayed = 1; ILibDuktape_readableStream_nextWriteablePipe *next; if (stream->noPropagateEnd == 0 && stream->nextWriteable != NULL) diff --git a/microscript/ILibDuktape_ReadableStream.h b/microscript/ILibDuktape_ReadableStream.h index f528ae1..286be6c 100644 --- a/microscript/ILibDuktape_ReadableStream.h +++ b/microscript/ILibDuktape_ReadableStream.h @@ -52,6 +52,7 @@ typedef struct ILibDuktape_readableStream #else int pipe_pendingCount; // No Atomic Built-ins... Use a Mutex #endif + int endRelayed; int pipeInProgress; int unpipeInProgress; int bypassValue;