CCodec: harden against nullptr/out-of-memory
Bug: 123571310
Test: bug repro steps
Change-Id: I7c12fd375c1e320ea12473835d6d90804936a45a
diff --git a/media/codec2/sfplugin/CCodecBufferChannel.cpp b/media/codec2/sfplugin/CCodecBufferChannel.cpp
index b529cbc..53ae585 100644
--- a/media/codec2/sfplugin/CCodecBufferChannel.cpp
+++ b/media/codec2/sfplugin/CCodecBufferChannel.cpp
@@ -1171,6 +1171,9 @@
size_t *index,
sp<MediaCodecBuffer> *clientBuffer) override {
sp<Codec2Buffer> newBuffer = wrap(buffer);
+ if (newBuffer == nullptr) {
+ return NO_MEMORY;
+ }
newBuffer->setFormat(mFormat);
*index = mImpl.assignSlot(newBuffer);
*clientBuffer = newBuffer;
@@ -1263,6 +1266,10 @@
return nullptr;
}
sp<Codec2Buffer> clientBuffer = ConstLinearBlockBuffer::Allocate(mFormat, buffer);
+ if (clientBuffer == nullptr) {
+ ALOGD("[%s] ConstLinearBlockBuffer::Allocate failed", mName);
+ return nullptr;
+ }
submit(clientBuffer);
return clientBuffer;
}
@@ -1303,6 +1310,10 @@
[lbp = mLocalBufferPool](size_t capacity) {
return lbp->newBuffer(capacity);
});
+ if (c2buffer == nullptr) {
+ ALOGD("[%s] ConstGraphicBlockBuffer::AllocateEmpty failed", mName);
+ return nullptr;
+ }
c2buffer->setRange(0, 0);
return c2buffer;
} else {
@@ -2708,6 +2719,9 @@
status_t err = (*buffers)->registerBuffer(entry.buffer, &index, &outBuffer);
if (err != OK) {
if (err != WOULD_BLOCK) {
+ if (!(*buffers)->isArrayMode()) {
+ *buffers = (*buffers)->toArrayMode(mNumOutputSlots);
+ }
OutputBuffersArray *array = (OutputBuffersArray *)buffers->get();
array->realloc(entry.buffer);
mCCodecCallback->onOutputBuffersChanged();
diff --git a/media/codec2/sfplugin/Codec2Buffer.cpp b/media/codec2/sfplugin/Codec2Buffer.cpp
index 597e8f3..2dec42e 100644
--- a/media/codec2/sfplugin/Codec2Buffer.cpp
+++ b/media/codec2/sfplugin/Codec2Buffer.cpp
@@ -451,6 +451,9 @@
}
bool setBackBuffer(const sp<ABuffer> &backBuffer) {
+ if (backBuffer == nullptr) {
+ return false;
+ }
if (backBuffer->capacity() < mBackBufferSize) {
return false;
}