AMediaExtractor: expand subsample sizes from 32-bit to size_t
Bug: 121387843
Test: MediaPlayer2DrmTest
Change-Id: I6ca467cb62daca3722016939a68a2ffd49dabd56
diff --git a/media/ndk/NdkMediaExtractor.cpp b/media/ndk/NdkMediaExtractor.cpp
index 8296598..28e4f12 100644
--- a/media/ndk/NdkMediaExtractor.cpp
+++ b/media/ndk/NdkMediaExtractor.cpp
@@ -46,6 +46,18 @@
sp<ABuffer> mPsshBuf;
};
+sp<ABuffer> U32ArrayToSizeBuf(size_t numSubSamples, uint32_t *data) {
+ if (numSubSamples > SIZE_MAX / sizeof(size_t)) {
+ return NULL;
+ }
+ sp<ABuffer> sizebuf = new ABuffer(numSubSamples * sizeof(size_t));
+ size_t *sizes = (size_t *)sizebuf->data();
+ for (size_t i = 0; sizes != NULL && i < numSubSamples; i++) {
+ sizes[i] = data[i];
+ }
+ return sizebuf;
+}
+
extern "C" {
EXPORT
@@ -339,7 +351,7 @@
if (!meta->findData(kKeyEncryptedSizes, &type, &crypteddata, &cryptedsize)) {
return NULL;
}
- size_t numSubSamples = cryptedsize / sizeof(size_t);
+ size_t numSubSamples = cryptedsize / sizeof(uint32_t);
const void *cleardata;
size_t clearsize;
@@ -373,6 +385,16 @@
mode = CryptoPlugin::kMode_AES_CTR;
}
+ if (sizeof(uint32_t) != sizeof(size_t)) {
+ sp<ABuffer> clearbuf = U32ArrayToSizeBuf(numSubSamples, (uint32_t *)cleardata);
+ sp<ABuffer> cryptedbuf = U32ArrayToSizeBuf(numSubSamples, (uint32_t *)crypteddata);
+ cleardata = clearbuf == NULL ? NULL : clearbuf->data();
+ crypteddata = crypteddata == NULL ? NULL : cryptedbuf->data();
+ if(crypteddata == NULL || cleardata == NULL) {
+ return NULL;
+ }
+ }
+
return AMediaCodecCryptoInfo_new(
numSubSamples,
(uint8_t*) key,