From a60689cd5024ad9d1976ebadc18360f03de7e0bf Mon Sep 17 00:00:00 2001 From: Sungtak Lee Date: Tue, 27 Feb 2024 19:49:29 +0000 Subject: [PATCH] media.bufferpool2: ensure message-ids are safe from overflow/underflow Since message-ids can be wrapped, they are not safe from overflow/underflow. Change them to be safe from overflow/underflow. Bug: 321674574 Change-Id: I39a4baf057fc81389925e0fe358894f62ade9423 --- media/bufferpool/aidl/default/BufferPool.cpp | 16 ++++++++-------- media/bufferpool/aidl/default/BufferStatus.cpp | 11 ++++++++++- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/media/bufferpool/aidl/default/BufferPool.cpp b/media/bufferpool/aidl/default/BufferPool.cpp index ed4574f9d6..57716db21c 100644 --- a/media/bufferpool/aidl/default/BufferPool.cpp +++ b/media/bufferpool/aidl/default/BufferPool.cpp @@ -102,11 +102,11 @@ void BufferPool::Invalidation::onBufferInvalidated( if (it->isInvalidated(bufferId)) { uint32_t msgId = 0; if (it->mNeedsAck) { - msgId = ++mInvalidationId; - if (msgId == 0) { - // wrap happens - msgId = ++mInvalidationId; + if (mInvalidationId == UINT_MAX) { + // wrap happens; + mInvalidationId = 0; } + msgId = ++mInvalidationId; } channel.postInvalidation(msgId, it->mFrom, it->mTo); it = mPendings.erase(it); @@ -125,11 +125,11 @@ void BufferPool::Invalidation::onInvalidationRequest( const std::shared_ptr &impl) { uint32_t msgId = 0; if (needsAck) { - msgId = ++mInvalidationId; - if (msgId == 0) { - // wrap happens - msgId = ++mInvalidationId; + if (mInvalidationId == UINT_MAX) { + //wrap happens + mInvalidationId = 0; } + msgId = ++mInvalidationId; } ALOGV("bufferpool2 invalidation requested and queued"); if (left == 0) { diff --git a/media/bufferpool/aidl/default/BufferStatus.cpp b/media/bufferpool/aidl/default/BufferStatus.cpp index 19caa1e5b5..fecbe3ff20 100644 --- a/media/bufferpool/aidl/default/BufferStatus.cpp +++ b/media/bufferpool/aidl/default/BufferStatus.cpp @@ -26,8 +26,17 @@ namespace aidl::android::hardware::media::bufferpool2::implementation { using aidl::android::hardware::media::bufferpool2::BufferStatus; +uint32_t wrappedMinus(uint32_t a, uint32_t b) { + if (a >= b) { + return a - b; + } else { + return ~(b - a) + 1; + } +} + bool isMessageLater(uint32_t curMsgId, uint32_t prevMsgId) { - return curMsgId != prevMsgId && curMsgId - prevMsgId < prevMsgId - curMsgId; + return curMsgId != prevMsgId && + wrappedMinus(curMsgId, prevMsgId) < wrappedMinus(prevMsgId, curMsgId); } bool isBufferInRange(BufferId from, BufferId to, BufferId bufferId) {