omx: restrict useBuffer according to buffer type and port mode Bug: 77486542 Test: sts-tradefed run sts -m StsHostTestCases -t android.security.sts.Poc18_06#testPocBug_77486542 Test: adb shell am instrument -e size small -w 'android.media.cts/android.support.test.runner.AndroidJUnitRunner' Test: Exercise secure playback with Play Movies app. Test: Record video with Camera app and play it back with Photos app Change-Id: Ief2d2d4d0445074c0ecdc723b1b25997a7631389 (cherry picked from commit 7d54e8f905784fddcc4c37fd094d4e18a73767bc)
diff --git a/media/libstagefright/omx/OMXNodeInstance.cpp b/media/libstagefright/omx/OMXNodeInstance.cpp index 015a148..4f38dee 100644 --- a/media/libstagefright/omx/OMXNodeInstance.cpp +++ b/media/libstagefright/omx/OMXNodeInstance.cpp
@@ -686,6 +686,7 @@ CLOG_CONFIG(setPortMode, "%s(%d), port %d", asString(mode), mode, portIndex); + status_t err = OK; switch (mode) { case IOMX::kPortModeDynamicANWBuffer: { @@ -694,17 +695,19 @@ CLOG_INTERNAL(setPortMode, "Legacy adaptive experiment: " "not setting port mode to %s(%d) on output", asString(mode), mode); - return StatusFromOMXError(OMX_ErrorUnsupportedIndex); + err = StatusFromOMXError(OMX_ErrorUnsupportedIndex); + break; } - status_t err = enableNativeBuffers_l( + err = enableNativeBuffers_l( portIndex, OMX_TRUE /*graphic*/, OMX_TRUE); if (err != OK) { - return err; + break; } } (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); - return storeMetaDataInBuffers_l(portIndex, OMX_TRUE, NULL); + err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE, NULL); + break; } case IOMX::kPortModeDynamicNativeHandle: @@ -712,13 +715,15 @@ if (portIndex != kPortIndexInput) { CLOG_ERROR(setPortMode, BAD_VALUE, "%s(%d) mode is only supported on input port", asString(mode), mode); - return BAD_VALUE; + err = BAD_VALUE; + break; } (void)enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_FALSE); (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); MetadataBufferType metaType = kMetadataBufferTypeNativeHandleSource; - return storeMetaDataInBuffers_l(portIndex, OMX_TRUE, &metaType); + err = storeMetaDataInBuffers_l(portIndex, OMX_TRUE, &metaType); + break; } case IOMX::kPortModePresetSecureBuffer: @@ -726,7 +731,8 @@ // Allow on both input and output. (void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL); (void)enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_FALSE); - return enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_TRUE); + err = enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_TRUE); + break; } case IOMX::kPortModePresetANWBuffer: @@ -734,7 +740,8 @@ if (portIndex != kPortIndexOutput) { CLOG_ERROR(setPortMode, BAD_VALUE, "%s(%d) mode is only supported on output port", asString(mode), mode); - return BAD_VALUE; + err = BAD_VALUE; + break; } // Check if we're simulating legacy mode with metadata mode, @@ -743,7 +750,7 @@ if (storeMetaDataInBuffers_l(portIndex, OMX_TRUE, NULL) == OK) { CLOG_INTERNAL(setPortMode, "Legacy adaptive experiment: " "metdata mode enabled successfully"); - return OK; + break; } CLOG_INTERNAL(setPortMode, "Legacy adaptive experiment: " @@ -754,15 +761,15 @@ // Disable secure buffer and enable graphic buffer (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); - status_t err = enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_TRUE); + err = enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_TRUE); if (err != OK) { - return err; + break; } // Not running experiment, or metadata is not supported. // Disable metadata mode and use legacy mode. (void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL); - return OK; + break; } case IOMX::kPortModePresetByteBuffer: @@ -771,15 +778,19 @@ (void)enableNativeBuffers_l(portIndex, OMX_TRUE /*graphic*/, OMX_FALSE); (void)enableNativeBuffers_l(portIndex, OMX_FALSE /*graphic*/, OMX_FALSE); (void)storeMetaDataInBuffers_l(portIndex, OMX_FALSE, NULL); - return OK; - } - - default: break; } - CLOG_ERROR(setPortMode, BAD_VALUE, "invalid port mode %d", mode); - return BAD_VALUE; + default: + CLOG_ERROR(setPortMode, BAD_VALUE, "invalid port mode %d", mode); + err = BAD_VALUE; + break; + } + + if (err == OK) { + mPortMode[portIndex] = mode; + } + return err; } status_t OMXNodeInstance::enableNativeBuffers_l( @@ -1057,28 +1068,48 @@ } switch (omxBuffer.mBufferType) { - case OMXBuffer::kBufferTypePreset: + case OMXBuffer::kBufferTypePreset: { + if (mPortMode[portIndex] != IOMX::kPortModeDynamicANWBuffer + && mPortMode[portIndex] != IOMX::kPortModeDynamicNativeHandle) { + break; + } return useBuffer_l(portIndex, NULL, NULL, buffer); + } - case OMXBuffer::kBufferTypeSharedMem: + case OMXBuffer::kBufferTypeSharedMem: { + if (mPortMode[portIndex] != IOMX::kPortModePresetByteBuffer) { + break; + } return useBuffer_l(portIndex, omxBuffer.mMem, NULL, buffer); + } - case OMXBuffer::kBufferTypeANWBuffer: + case OMXBuffer::kBufferTypeANWBuffer: { + if (mPortMode[portIndex] != IOMX::kPortModePresetANWBuffer) { + break; + } return useGraphicBuffer_l(portIndex, omxBuffer.mGraphicBuffer, buffer); + } case OMXBuffer::kBufferTypeHidlMemory: { + if (mPortMode[portIndex] != IOMX::kPortModePresetByteBuffer + && mPortMode[portIndex] != IOMX::kPortModeDynamicANWBuffer) { + break; + } sp<IHidlMemory> hidlMemory = mapMemory(omxBuffer.mHidlMemory); if (hidlMemory == nullptr) { ALOGE("OMXNodeInstance useBuffer() failed to map memory"); return NO_MEMORY; } return useBuffer_l(portIndex, NULL, hidlMemory, buffer); - } + } default: + return BAD_VALUE; break; } - return BAD_VALUE; + ALOGE("b/77486542"); + android_errorWriteLog(0x534e4554, "77486542"); + return INVALID_OPERATION; } status_t OMXNodeInstance::useBuffer_l( @@ -1514,6 +1545,11 @@ android_errorWriteLog(0x534e4554, "35467458"); return BAD_VALUE; } + if (mPortMode[portIndex] != IOMX::kPortModePresetSecureBuffer) { + ALOGE("b/77486542"); + android_errorWriteLog(0x534e4554, "77486542"); + return INVALID_OPERATION; + } BufferMeta *buffer_meta = new BufferMeta(portIndex); OMX_BUFFERHEADERTYPE *header;