From 078536b2bb66605ac76a5f8819695c0cd44c9212 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Wed, 21 Oct 2020 23:48:32 +0000 Subject: [PATCH] [DOM Fetch] Detect broken pipes and propagate that write error to the caller. --- dom/fetch/FetchDriver.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dom/fetch/FetchDriver.cpp b/dom/fetch/FetchDriver.cpp index d18db2834b..79bd5a0e39 100644 --- a/dom/fetch/FetchDriver.cpp +++ b/dom/fetch/FetchDriver.cpp @@ -771,6 +771,17 @@ FetchDriver::OnDataAvailable(nsIRequest* aRequest, nsresult rv = aInputStream->ReadSegments(NS_CopySegmentToStream, mPipeOutputStream, aCount, &aRead); + + // If no data was read, it's possible the output stream is closed but the + // ReadSegments call followed its contract of returning NS_OK despite write + // errors. Unfortunately, nsIOutputStream has an ill-conceived contract when + // taken together with ReadSegments' contract, because the pipe will just + // NS_OK if we try and invoke its Write* functions ourselves with a 0 count. + // So we must just assume the pipe is broken. + if (aRead == 0 && aCount != 0) { + return NS_BASE_STREAM_CLOSED; + } + return rv; }