From 5e18c43fa7cd0084202a6f092f8a30e826ad9ae1 Mon Sep 17 00:00:00 2001 From: Valerie Hau Date: Mon, 26 Aug 2019 12:48:49 -0700 Subject: [PATCH] Do not crash on invalid dataspace Prior logic caused device to crash when setting the dataspace for a layer to hdr on a non-hdr device. Update to log the failure and perform a no-op to match framework APIs. Bug: 140029823 Test: build, boot, CtsViewTestCases:android.view.cts.ASurfaceControlTest Change-Id: I9baf88a6d787e043b440ad4c2ebeb4c7a1fd90a2 --- native/android/surface_control.cpp | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp index 8fe4fecceeb5d..53c01226ca1ae 100644 --- a/native/android/surface_control.cpp +++ b/native/android/surface_control.cpp @@ -100,7 +100,11 @@ static bool isDataSpaceValid(const sp& surfaceControl, ADataSpac return getWideColorSupport(surfaceControl); // These data space need HDR support. case HAL_DATASPACE_BT2020_PQ: - return getHdrSupport(surfaceControl); + if (!getHdrSupport(surfaceControl)) { + ALOGE("Invalid dataspace - device does not support hdr"); + return false; + } + return true; default: return false; } @@ -458,10 +462,11 @@ void ASurfaceTransaction_setBufferDataSpace(ASurfaceTransaction* aSurfaceTransac CHECK_NOT_NULL(aSurfaceControl); sp surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); - LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, aDataSpace), "invalid dataspace"); - + if (!isDataSpaceValid(surfaceControl, aDataSpace)) { + ALOGE("Failed to set buffer dataspace - invalid dataspace"); + return; + } Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); - transaction->setDataspace(surfaceControl, static_cast(aDataSpace)); } @@ -527,7 +532,10 @@ void ASurfaceTransaction_setColor(ASurfaceTransaction* aSurfaceTransaction, CHECK_NOT_NULL(aSurfaceControl); sp surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl); - LOG_ALWAYS_FATAL_IF(!isDataSpaceValid(surfaceControl, dataspace), "invalid dataspace"); + if (!isDataSpaceValid(surfaceControl, dataspace)) { + ALOGE("Failed to set buffer dataspace - invalid dataspace"); + return; + } Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction); half3 color;