Bug 1126088 - Fallibly allocate MP4Stream CacheBlocks. r=jya, r=njn, a=sledru
--- a/dom/media/fmp4/MP4Stream.cpp
+++ b/dom/media/fmp4/MP4Stream.cpp
@@ -23,22 +23,25 @@ MP4Stream::~MP4Stream()
MOZ_ASSERT(mPinCount == 0);
}
bool
MP4Stream::BlockingReadIntoCache(int64_t aOffset, size_t aCount, Monitor* aToUnlock)
{
MOZ_ASSERT(mPinCount > 0);
CacheBlock block(aOffset, aCount);
+ if (!block.Init()) {
+ return false;
+ }
uint32_t sum = 0;
uint32_t bytesRead = 0;
do {
uint64_t offset = aOffset + sum;
- char* buffer = reinterpret_cast<char*>(block.mBuffer.get()) + sum;
+ char* buffer = block.Buffer() + sum;
uint32_t toRead = aCount - sum;
MonitorAutoUnlock unlock(*aToUnlock);
nsresult rv = mResource->ReadAt(offset, buffer, toRead, &bytesRead);
if (NS_FAILED(rv)) {
return false;
}
sum += bytesRead;
} while (sum < aCount && bytesRead > 0);
@@ -71,17 +74,17 @@ MP4Stream::ReadAt(int64_t aOffset, void*
bool
MP4Stream::CachedReadAt(int64_t aOffset, void* aBuffer, size_t aCount,
size_t* aBytesRead)
{
// First, check our local cache.
for (size_t i = 0; i < mCache.Length(); ++i) {
if (mCache[i].mOffset == aOffset && mCache[i].mCount >= aCount) {
- memcpy(aBuffer, mCache[i].mBuffer, aCount);
+ memcpy(aBuffer, mCache[i].Buffer(), aCount);
*aBytesRead = aCount;
return true;
}
}
nsresult rv = mResource->ReadFromCache(reinterpret_cast<char*>(aBuffer),
aOffset, aCount);
if (NS_FAILED(rv)) {
--- a/dom/media/fmp4/MP4Stream.h
+++ b/dom/media/fmp4/MP4Stream.h
@@ -6,16 +6,17 @@
#ifndef MP4_STREAM_H_
#define MP4_STREAM_H_
#include "mp4_demuxer/mp4_demuxer.h"
#include "MediaResource.h"
+#include "mozilla/fallible.h"
#include "mozilla/Maybe.h"
#include "mozilla/Monitor.h"
namespace mozilla {
class Monitor;
class MP4Stream : public mp4_demuxer::Stream {
@@ -65,19 +66,33 @@ public:
private:
nsRefPtr<MediaResource> mResource;
Maybe<ReadRecord> mFailedRead;
uint32_t mPinCount;
struct CacheBlock {
CacheBlock(int64_t aOffset, size_t aCount)
- : mOffset(aOffset), mCount(aCount), mBuffer(new uint8_t[aCount]) {}
+ : mOffset(aOffset), mCount(aCount), mBuffer(nullptr) {}
int64_t mOffset;
size_t mCount;
- nsAutoArrayPtr<uint8_t> mBuffer;
+
+ bool Init()
+ {
+ mBuffer = new ((fallible_t())) char[mCount];
+ return !!mBuffer;
+ }
+
+ char* Buffer()
+ {
+ MOZ_ASSERT(mBuffer.get());
+ return mBuffer.get();
+ }
+
+ private:
+ nsAutoArrayPtr<char> mBuffer;
};
nsTArray<CacheBlock> mCache;
};
}
#endif