Bug 645773 - Reorder a sensitive computation to avoid signed vs unsigned issues. Return a null range from SelectSeekRange when stream length is unknown. r=cpearce

This commit is contained in:
Matthew Gregan 2011-04-01 17:18:43 +13:00
Родитель 3ee60da385
Коммит 15da3a33cb
1 изменённых файлов: 11 добавлений и 7 удалений

Просмотреть файл

@ -838,7 +838,10 @@ nsOggReader::SelectSeekRange(const nsTArray<SeekRange>& ranges,
return ranges[i]; return ranges[i];
} }
} }
return aExact ? SeekRange() : SeekRange(so, eo, st, et); if (aExact || eo == -1) {
return SeekRange();
}
return SeekRange(so, eo, st, et);
} }
nsOggReader::IndexedSeekResult nsOggReader::RollbackIndexedSeek(PRInt64 aOffset) nsOggReader::IndexedSeekResult nsOggReader::RollbackIndexedSeek(PRInt64 aOffset)
@ -1096,17 +1099,18 @@ PageSync(nsMediaStream* aStream,
NS_ASSERTION(buffer, "Must have a buffer"); NS_ASSERTION(buffer, "Must have a buffer");
// Read from the file into the buffer // Read from the file into the buffer
PRUint32 bytesToRead = PRInt64 bytesToRead = NS_MIN(static_cast<PRInt64>(PAGE_STEP),
static_cast<PRUint32>(NS_MIN(static_cast<PRInt64>(PAGE_STEP), aEndOffset - readHead);
aEndOffset - readHead)); NS_ASSERTION(bytesToRead <= PR_UINT32_MAX, "bytesToRead range check");
if (bytesToRead <= 0) { if (bytesToRead <= 0) {
return PAGE_SYNC_END_OF_RANGE; return PAGE_SYNC_END_OF_RANGE;
} }
nsresult rv = NS_OK; nsresult rv = NS_OK;
if (aCachedDataOnly) { if (aCachedDataOnly) {
rv = aStream->ReadFromCache(buffer, readHead, bytesToRead); rv = aStream->ReadFromCache(buffer, readHead,
static_cast<PRUint32>(bytesToRead));
NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR); NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR);
bytesRead = bytesToRead; bytesRead = static_cast<PRUint32>(bytesToRead);
} else { } else {
rv = aStream->Seek(nsISeekableStream::NS_SEEK_SET, readHead); rv = aStream->Seek(nsISeekableStream::NS_SEEK_SET, readHead);
NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR); NS_ENSURE_SUCCESS(rv,PAGE_SYNC_ERROR);
@ -1250,7 +1254,7 @@ nsresult nsOggReader::SeekBisection(PRInt64 aTarget,
NS_ASSERTION(guess >= startOffset + startLength, "Guess must be after range start"); NS_ASSERTION(guess >= startOffset + startLength, "Guess must be after range start");
NS_ASSERTION(guess < endOffset, "Guess must be before range end"); NS_ASSERTION(guess < endOffset, "Guess must be before range end");
NS_ASSERTION(guess != previousGuess, "Guess should be differnt to previous"); NS_ASSERTION(guess != previousGuess, "Guess should be different to previous");
previousGuess = guess; previousGuess = guess;
hops++; hops++;