--- a/netwerk/streamconv/converters/nsHTTPCompressConv.cpp +++ a/netwerk/streamconv/converters/nsHTTPCompressConv.cpp @@ -160,31 +160,36 @@ nsHTTPCompressConv::OnStopRequest(nsIReq NS_METHOD nsHTTPCompressConv::BrotliHandler(nsIInputStream *stream, void *closure, const char *dataIn, uint32_t, uint32_t aAvail, uint32_t *countRead) { MOZ_ASSERT(stream); nsHTTPCompressConv *self = static_cast(closure); *countRead = 0; - const uint32_t kOutSize = 128 * 1024; // just a chunk size, we call in a loop - unsigned char outBuffer[kOutSize]; - unsigned char *outPtr; + const size_t kOutSize = 128 * 1024; // just a chunk size, we call in a loop + uint8_t *outPtr; size_t outSize; size_t avail = aAvail; BrotliResult res; if (!self->mBrotli) { *countRead = aAvail; return NS_OK; } + auto outBuffer = MakeUniqueFallible(kOutSize); + if (outBuffer == nullptr) { + self->mBrotli->mStatus = NS_ERROR_OUT_OF_MEMORY; + return self->mBrotli->mStatus; + } + do { outSize = kOutSize; - outPtr = outBuffer; + outPtr = outBuffer.get(); // brotli api is documented in brotli/dec/decode.h and brotli/dec/decode.c LOG(("nsHttpCompresssConv %p brotlihandler decompress %d\n", self, avail)); res = ::BrotliDecompressStream( &avail, reinterpret_cast(&dataIn), &outSize, &outPtr, &self->mBrotli->mTotalOut, &self->mBrotli->mState); outSize = kOutSize - outSize; LOG(("nsHttpCompresssConv %p brotlihandler decompress rv=%x out=%d\n", @@ -205,17 +210,17 @@ nsHTTPCompressConv::BrotliHandler(nsIInp self->mBrotli->mStatus = NS_ERROR_UNEXPECTED; return self->mBrotli->mStatus; } } if (outSize > 0) { nsresult rv = self->do_OnDataAvailable(self->mBrotli->mRequest, self->mBrotli->mContext, self->mBrotli->mSourceOffset, - reinterpret_cast(outBuffer), + reinterpret_cast(outBuffer.get()), outSize); LOG(("nsHttpCompressConv %p BrotliHandler ODA rv=%x", self, rv)); if (NS_FAILED(rv)) { self->mBrotli->mStatus = rv; return self->mBrotli->mStatus; } }