Zero-initialize HIDL structs before passing
Test: atest CtsMediaTestCases -- --module-arg CtsMediaTestCases:size:small
(only existing failures/flakes)
Bug: 131267328
Bug: 131356202
Change-Id: I91e6e0c692d470f4d3a713068545cedf5ae925a7
diff --git a/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp b/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp
index e64ba9b..cee1b81 100644
--- a/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp
+++ b/libs/gui/bufferqueue/1.0/H2BGraphicBufferProducer.cpp
@@ -1061,7 +1061,7 @@
status_t H2BGraphicBufferProducer::attachBuffer(
int* outSlot, const sp<GraphicBuffer>& buffer) {
- AnwBuffer tBuffer;
+ AnwBuffer tBuffer{};
wrapAs(&tBuffer, *buffer);
status_t fnStatus;
status_t transStatus = toStatusT(mBase->attachBuffer(tBuffer,
@@ -1076,7 +1076,7 @@
int slot,
const QueueBufferInput& input,
QueueBufferOutput* output) {
- HGraphicBufferProducer::QueueBufferInput tInput;
+ HGraphicBufferProducer::QueueBufferInput tInput{};
native_handle_t* nh;
if (!wrapAs(&tInput, &nh, input)) {
ALOGE("H2BGraphicBufferProducer::queueBuffer - "
diff --git a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp
index e039593..e891ec5 100644
--- a/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp
+++ b/libs/gui/bufferqueue/2.0/B2HGraphicBufferProducer.cpp
@@ -15,7 +15,7 @@
*/
//#define LOG_NDEBUG 0
-#define LOG_TAG "H2BGraphicBufferProducer@2.0"
+#define LOG_TAG "B2HGraphicBufferProducer@2.0"
#include <android-base/logging.h>
@@ -30,13 +30,38 @@
#include <vndk/hardware_buffer.h>
namespace android {
-
namespace hardware {
namespace graphics {
namespace bufferqueue {
namespace V2_0 {
namespace utils {
+namespace /* unnamed */ {
+
+using BQueueBufferInput = ::android::
+ IGraphicBufferProducer::QueueBufferInput;
+using HQueueBufferInput = ::android::hardware::graphics::bufferqueue::V2_0::
+ IGraphicBufferProducer::QueueBufferInput;
+using BQueueBufferOutput = ::android::
+ IGraphicBufferProducer::QueueBufferOutput;
+using HQueueBufferOutput = ::android::hardware::graphics::bufferqueue::V2_0::
+ IGraphicBufferProducer::QueueBufferOutput;
+
+using ::android::hardware::graphics::bufferqueue::V2_0::utils::b2h;
+using ::android::hardware::graphics::bufferqueue::V2_0::utils::h2b;
+
+bool b2h(BQueueBufferOutput const& from, HQueueBufferOutput* to) {
+ to->width = from.width;
+ to->height = from.height;
+ to->transformHint = static_cast<int32_t>(from.transformHint);
+ to->numPendingBuffers = from.numPendingBuffers;
+ to->nextFrameNumber = from.nextFrameNumber;
+ to->bufferReplaced = from.bufferReplaced;
+ return true;
+}
+
+} // unnamed namespace
+
// B2HGraphicBufferProducer
// ========================
@@ -161,11 +186,7 @@
int32_t slot,
QueueBufferInput const& hInput,
queueBuffer_cb _hidl_cb) {
- using HOutput = QueueBufferOutput;
- using BInput = BGraphicBufferProducer::QueueBufferInput;
- using BOutput = BGraphicBufferProducer::QueueBufferOutput;
-
- BInput bInput{
+ BQueueBufferInput bInput{
hInput.timestamp,
hInput.isAutoTimestamp,
static_cast<android_dataspace>(hInput.dataSpace),
@@ -178,35 +199,32 @@
// Convert crop.
if (!h2b(hInput.crop, &bInput.crop)) {
- _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{});
+ _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{});
return {};
}
// Convert surfaceDamage.
if (!h2b(hInput.surfaceDamage, &bInput.surfaceDamage)) {
- _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{});
+ _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{});
return {};
}
// Convert fence.
if (!h2b(hInput.fence, &bInput.fence)) {
- _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{});
+ _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{});
return {};
}
- BOutput bOutput{};
+ BQueueBufferOutput bOutput{};
HStatus hStatus{};
- bool converted = b2h(
- mBase->queueBuffer(static_cast<int>(slot), bInput, &bOutput),
- &hStatus);
+ QueueBufferOutput hOutput{};
+ bool converted =
+ b2h(
+ mBase->queueBuffer(static_cast<int>(slot), bInput, &bOutput),
+ &hStatus) &&
+ b2h(bOutput, &hOutput);
- _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR,
- HOutput{bOutput.width,
- bOutput.height,
- static_cast<int32_t>(bOutput.transformHint),
- bOutput.numPendingBuffers,
- bOutput.nextFrameNumber,
- bOutput.bufferReplaced});
+ _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR, hOutput);
return {};
}
@@ -236,33 +254,23 @@
HConnectionType hConnectionType,
bool producerControlledByApp,
connect_cb _hidl_cb) {
- using BOutput = BGraphicBufferProducer::QueueBufferOutput;
- using HOutput = HGraphicBufferProducer::QueueBufferOutput;
sp<BProducerListener> bListener = new H2BProducerListener(hListener);
- if (!bListener) {
- _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{});
+ int bConnectionType{};
+ if (!bListener || !h2b(hConnectionType, &bConnectionType)) {
+ _hidl_cb(HStatus::UNKNOWN_ERROR, QueueBufferOutput{});
return {};
}
- int bConnectionType;
- if (!h2b(hConnectionType, &bConnectionType)) {
- _hidl_cb(HStatus::UNKNOWN_ERROR, HOutput{});
- return {};
- }
- BOutput bOutput{};
+ BQueueBufferOutput bOutput{};
HStatus hStatus{};
- bool converted = b2h(
- mBase->connect(bListener,
- bConnectionType,
- producerControlledByApp,
- &bOutput),
- &hStatus);
- _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR,
- HOutput{bOutput.width,
- bOutput.height,
- static_cast<int32_t>(bOutput.transformHint),
- bOutput.numPendingBuffers,
- bOutput.nextFrameNumber,
- bOutput.bufferReplaced});
+ QueueBufferOutput hOutput{};
+ bool converted =
+ b2h(mBase->connect(bListener,
+ bConnectionType,
+ producerControlledByApp,
+ &bOutput),
+ &hStatus) &&
+ b2h(bOutput, &hOutput);
+ _hidl_cb(converted ? hStatus : HStatus::UNKNOWN_ERROR, hOutput);
return {};
}
diff --git a/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp b/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp
index 1023ef1..2f5b73c 100644
--- a/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp
+++ b/libs/gui/bufferqueue/2.0/H2BGraphicBufferProducer.cpp
@@ -29,13 +29,54 @@
#include <vndk/hardware_buffer.h>
namespace android {
-
namespace hardware {
namespace graphics {
namespace bufferqueue {
namespace V2_0 {
namespace utils {
+namespace /* unnamed */ {
+
+using BQueueBufferInput = ::android::
+ IGraphicBufferProducer::QueueBufferInput;
+using HQueueBufferInput = ::android::hardware::graphics::bufferqueue::V2_0::
+ IGraphicBufferProducer::QueueBufferInput;
+using BQueueBufferOutput = ::android::
+ IGraphicBufferProducer::QueueBufferOutput;
+using HQueueBufferOutput = ::android::hardware::graphics::bufferqueue::V2_0::
+ IGraphicBufferProducer::QueueBufferOutput;
+
+using ::android::hardware::graphics::bufferqueue::V2_0::utils::b2h;
+using ::android::hardware::graphics::bufferqueue::V2_0::utils::h2b;
+
+bool b2h(BQueueBufferInput const& from, HQueueBufferInput* to,
+ HFenceWrapper* hFenceWrapper) {
+ to->timestamp = from.timestamp;
+ to->isAutoTimestamp = static_cast<bool>(from.isAutoTimestamp);
+ to->dataSpace = static_cast<int32_t>(from.dataSpace);
+ to->transform = static_cast<int32_t>(from.transform);
+ to->stickyTransform = static_cast<int32_t>(from.stickyTransform);
+ if (!b2h(from.crop, &to->crop) ||
+ !b2h(from.surfaceDamage, &to->surfaceDamage) ||
+ !b2h(from.fence, hFenceWrapper)) {
+ return false;
+ }
+ to->fence = hFenceWrapper->getHandle();
+ return true;
+}
+
+bool h2b(HQueueBufferOutput const& from, BQueueBufferOutput* to) {
+ to->width = from.width;
+ to->height = from.height;
+ to->transformHint = static_cast<uint32_t>(from.transformHint);
+ to->numPendingBuffers = from.numPendingBuffers;
+ to->nextFrameNumber = from.nextFrameNumber;
+ to->bufferReplaced = from.bufferReplaced;
+ return true;
+}
+
+} // unnamed namespace
+
// H2BGraphicBufferProducer
// ========================
@@ -209,47 +250,13 @@
int slot,
QueueBufferInput const& input,
QueueBufferOutput* output) {
- HRect hCrop{};
- (void)b2h(input.crop, &hCrop);
-
- using HInput = HGraphicBufferProducer::QueueBufferInput;
- HInput hInput{
- input.timestamp,
- static_cast<bool>(input.isAutoTimestamp),
- static_cast<int32_t>(input.dataSpace),
- {}, // crop
- static_cast<int32_t>(input.transform),
- static_cast<int32_t>(input.stickyTransform),
- {}, // fence
- {} // surfaceDamage
- };
-
- // Convert crop.
- if (!b2h(input.crop, &hInput.crop)) {
- LOG(ERROR) << "queueBuffer: corrupted input crop rectangle.";
- return UNKNOWN_ERROR;
- }
-
- // Convert surfaceDamage.
- size_t numRects;
- Rect const* rectArray = input.surfaceDamage.getArray(&numRects);
- hInput.surfaceDamage.resize(numRects);
- for (size_t i = 0; i < numRects; ++i) {
- if (!b2h(rectArray[i], &hInput.surfaceDamage[i])) {
- LOG(ERROR) << "queueBuffer: corrupted input surface damage.";
- return UNKNOWN_ERROR;
- }
- }
-
- // Convert fence.
+ HQueueBufferInput hInput{};
HFenceWrapper hFenceWrapper;
- if (!b2h(input.fence, &hFenceWrapper)) {
- LOG(ERROR) << "queueBuffer: corrupted input fence.";
+ if (!b2h(input, &hInput, &hFenceWrapper)) {
+ LOG(ERROR) << "queueBuffer: corrupted input.";
return UNKNOWN_ERROR;
}
- hInput.fence = hFenceWrapper.getHandle();
- using HOutput = HGraphicBufferProducer::QueueBufferOutput;
bool converted{};
status_t bStatus{};
Return<void> transResult = mBase->queueBuffer(
@@ -257,15 +264,8 @@
hInput,
[&converted, &bStatus, output](
HStatus hStatus,
- HOutput const& hOutput) {
- converted = h2b(hStatus, &bStatus);
- output->width = hOutput.width;
- output->height = hOutput.height;
- output->transformHint =
- static_cast<uint32_t>(hOutput.transformHint);
- output->numPendingBuffers = hOutput.numPendingBuffers;
- output->nextFrameNumber = hOutput.nextFrameNumber;
- output->bufferReplaced = hOutput.bufferReplaced;
+ HQueueBufferOutput const& hOutput) {
+ converted = h2b(hStatus, &bStatus) && h2b(hOutput, output);
});
if (!transResult.isOk()) {
@@ -332,7 +332,6 @@
}
}
- using HOutput = HGraphicBufferProducer::QueueBufferOutput;
bool converted{};
status_t bStatus{};
Return<void> transResult = mBase->connect(
@@ -341,15 +340,8 @@
producerControlledByApp,
[&converted, &bStatus, output](
HStatus hStatus,
- HOutput hOutput) {
- converted = h2b(hStatus, &bStatus);
- output->width = hOutput.width;
- output->height = hOutput.height;
- output->transformHint =
- static_cast<uint32_t>(hOutput.transformHint);
- output->numPendingBuffers = hOutput.numPendingBuffers;
- output->nextFrameNumber = hOutput.nextFrameNumber;
- output->bufferReplaced = hOutput.bufferReplaced;
+ HQueueBufferOutput const& hOutput) {
+ converted = h2b(hStatus, &bStatus) && h2b(hOutput, output);
});
if (!transResult.isOk()) {
LOG(ERROR) << "connect: transaction failed.";