Skip to content

Commit 2a42295

Browse files
committed
AsyncStreams: Avoid buffer leak when stopping async streams on close / finish
1 parent e54d8ab commit 2a42295

File tree

2 files changed

+20
-0
lines changed

2 files changed

+20
-0
lines changed

Libraries/AsyncStreams/AsyncRequestStreams.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,14 @@ void SC::AsyncRequestReadableStream<AsyncReadRequest>::onCloseStopRequest()
4949
{
5050
if (not request.isFree())
5151
{
52+
SC::Result res = SC::Result::Error("Fake error to unref bufferID");
53+
54+
typename AsyncReadRequest::Result result(*eventLoop, request, res, nullptr);
55+
56+
justUnrefBuffer = true;
57+
request.callback(result); // will free bufferID
5258
request.stop(*eventLoop);
59+
justUnrefBuffer = false;
5360
}
5461
if (autoCloseDescriptor)
5562
{
@@ -111,6 +118,8 @@ void SC::AsyncRequestReadableStream<AsyncReadRequest>::afterRead(typename AsyncR
111118
else
112119
{
113120
getBuffersPool().unrefBuffer(bufferID);
121+
if (justUnrefBuffer)
122+
return;
114123
AsyncReadableStream::emitError(result.isValid());
115124
}
116125
}
@@ -161,7 +170,14 @@ void SC::AsyncRequestWritableStream<AsyncWriteRequest>::onFinishStopRequest()
161170
{
162171
if (not request.isFree())
163172
{
173+
SC::Result res = SC::Result::Error("Fake error to unref bufferID");
174+
175+
typename AsyncWriteRequest::Result result(*eventLoop, request, res, nullptr);
176+
177+
justUnrefBuffer = true;
178+
request.callback(result); // will free bufferID
164179
request.stop(*eventLoop);
180+
justUnrefBuffer = false;
165181
}
166182
if (autoCloseDescriptor)
167183
{
@@ -183,6 +199,8 @@ SC::Result SC::AsyncRequestWritableStream<AsyncWriteRequest>::write(AsyncBufferV
183199
request.callback = [this, bufferID](typename AsyncWriteRequest::Result& result)
184200
{
185201
getBuffersPool().unrefBuffer(bufferID);
202+
if (justUnrefBuffer)
203+
return;
186204
auto callbackCopy = move(callback);
187205
callback = {};
188206
AsyncWritableStream::finishedWriting(bufferID, move(callbackCopy), result.isValid());

Libraries/AsyncStreams/AsyncRequestStreams.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ struct AsyncRequestReadableStream : public AsyncReadableStream
2222
AsyncEventLoop* eventLoop = nullptr;
2323

2424
bool autoCloseDescriptor = false;
25+
bool justUnrefBuffer = false;
2526

2627
Result read();
2728

@@ -48,6 +49,7 @@ struct AsyncRequestWritableStream : public AsyncWritableStream
4849
AsyncEventLoop* eventLoop = nullptr;
4950

5051
bool autoCloseDescriptor = false;
52+
bool justUnrefBuffer = false;
5153

5254
Function<void(AsyncBufferView::ID)> callback;
5355

0 commit comments

Comments
 (0)