From: timeless@mozdev.org review comments for biesi diff --git a/netwerk/streamconv/converters/nsBinHexDecoder.cpp b/netwerk/streamconv/converters/nsBinHexDecoder.cpp --- a/netwerk/streamconv/converters/nsBinHexDecoder.cpp +++ b/netwerk/streamconv/converters/nsBinHexDecoder.cpp @@ -160,22 +160,28 @@ nsBinHexDecoder::OnDataAvailable(nsIRequ PRUint32 aSourceOffset, PRUint32 aCount) { + if (!aCount) + return NS_OK; + + NS_ENSURE_STATE(mOutputStream && mDataBuffer); + nsresult rv = NS_OK; + PRUint32 numBytesRead = 0; + while (aCount > 0) // while we still have bytes to copy... + { + rv = aStream->Read(mDataBuffer, PR_MIN(aCount, DATA_BUFFER_SIZE - 1), &numBytesRead); + if (NS_FAILED(rv)) + return rv; - if (mOutputStream && mDataBuffer && aCount > 0) - { - PRUint32 numBytesRead = 0; - while (aCount > 0) // while we still have bytes to copy... - { - aStream->Read(mDataBuffer, PR_MIN(aCount, DATA_BUFFER_SIZE - 1), &numBytesRead); - if (aCount >= numBytesRead) - aCount -= numBytesRead; // subtract off the number of bytes we just read - else - aCount = 0; + if (aCount >= numBytesRead) + aCount -= numBytesRead; // subtract off the number of bytes we just read + else + aCount = 0; - // Process this new chunk of bin hex data... - ProcessNextChunk(request, aCtxt, numBytesRead); - } + // Process this new chunk of bin hex data... + rv = ProcessNextChunk(request, aCtxt, numBytesRead); + if (NS_FAILED(rv)) + return rv; } return rv; @@ -183,7 +189,7 @@ nsBinHexDecoder::OnDataAvailable(nsIRequ nsresult nsBinHexDecoder::ProcessNextState(nsIRequest * aRequest, nsISupports * aContext) { - nsresult status = NS_OK; + nsresult rv = NS_OK; PRUint16 tmpcrc, cval; unsigned char ctmp, c = mRlebuf; @@ -204,6 +210,9 @@ nsresult nsBinHexDecoder::ProcessNextSta // c & 63 returns the length of mName. So if we need the length, that's how // you can figure it out.... mName.SetLength(c & 63); + if (mName.Length() != (c & 63)) + return NS_ERROR_OUT_OF_MEMORY; + break; case BINHEX_STATE_FNAME: @@ -253,19 +262,24 @@ nsresult nsBinHexDecoder::ProcessNextSta if (mState == BINHEX_STATE_DFORK) { PRUint32 numBytesWritten = 0; - mOutputStream->Write(mOutgoingBuffer, mPosOutputBuff, &numBytesWritten); + rv = mOutputStream->Write(mOutgoingBuffer, mPosOutputBuff, &numBytesWritten); + if (NS_FAILED(rv)) + return rv; + if (PRInt32(numBytesWritten) != mPosOutputBuff) - status = NS_ERROR_FAILURE; + rv = NS_ERROR_FAILURE; // now propagate the data we just wrote - mNextListener->OnDataAvailable(aRequest, aContext, mInputStream, 0, numBytesWritten); + rv = mNextListener->OnDataAvailable(aRequest, aContext, mInputStream, 0, numBytesWritten); + if (NS_FAILED(rv)) + return rv; } else - status = NS_OK; /* do nothing for resource fork. */ + rv = NS_OK; /* do nothing for resource fork. */ mPosOutputBuff = 0; - if (status != NS_OK) + if (rv != NS_OK) mState = BINHEX_STATE_DONE; else ++mState; @@ -277,11 +291,17 @@ nsresult nsBinHexDecoder::ProcessNextSta if (mState == BINHEX_STATE_DFORK) { PRUint32 numBytesWritten = 0; - mOutputStream->Write(mOutgoingBuffer, mPosOutputBuff, &numBytesWritten); + rv = mOutputStream->Write(mOutgoingBuffer, mPosOutputBuff, &numBytesWritten); + if (NS_FAILED(rv)) + return rv; + if (PRInt32(numBytesWritten) != mPosOutputBuff) - status = NS_ERROR_FAILURE; + rv = NS_ERROR_FAILURE; - mNextListener->OnDataAvailable(aRequest, aContext, mInputStream, 0, numBytesWritten); + rv = mNextListener->OnDataAvailable(aRequest, aContext, mInputStream, 0, numBytesWritten); + if (NS_FAILED(rv)) + return rv; + mPosOutputBuff = 0; } } @@ -308,7 +328,7 @@ nsresult nsBinHexDecoder::ProcessNextSta mNextListener->OnStopRequest(aRequest, aContext, NS_OK); mNextListener = 0; - /* now We are done with everything. */ + /* now We are done with everything. */ ++mState; break; } @@ -345,6 +365,7 @@ nsresult nsBinHexDecoder::ProcessNextChu NS_ENSURE_TRUE(numBytesInBuffer > 0, NS_ERROR_FAILURE); + nsresult rv; // if it is the first time, seek to the right start place. if (mState == BINHEX_STATE_START) { @@ -381,14 +402,14 @@ nsresult nsBinHexDecoder::ProcessNextChu do { if (mPosInDataBuffer >= numBytesInBuffer) - return NS_OK; /* end of buff, go on for the nxet calls. */ + return NS_OK; /* end of buff, go on for the next calls. */ c = GetNextChar(numBytesInBuffer); if (c == 0) return NS_OK; if ((val = BHEXVAL(c)) == PRUint32(-1)) { - /* we incount an invalid character. */ + /* we encounter an invalid character. */ if (c) { /* rolling back. */ @@ -424,20 +445,27 @@ nsresult nsBinHexDecoder::ProcessNextChu if (c == 0) { mRlebuf = 0x90; - ProcessNextState(aRequest, aContext); + rv = ProcessNextState(aRequest, aContext); + if (NS_FAILED(rv)) + return rv; } else { /* we are in the run length mode */ - while (--c > 0) - ProcessNextState(aRequest, aContext); + while (--c > 0) { + rv = ProcessNextState(aRequest, aContext); + if (NS_FAILED(rv)) + return rv; + } } mMarker = 0; } else { mRlebuf = (unsigned char) c; - ProcessNextState(aRequest, aContext); + rv = ProcessNextState(aRequest, aContext); + if (NS_FAILED(rv)) + return rv; } if (mState >= BINHEX_STATE_DONE) @@ -452,7 +480,7 @@ nsresult nsBinHexDecoder::ProcessNextChu mOctetBuf.val = 0; } - return NS_OK; + return NS_OK; } PRInt16 nsBinHexDecoder::GetNextChar(PRUint32 numBytesInBuffer)