diff options
author | Devin Moore <devinmoore@google.com> | 2024-01-19 17:39:28 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2024-01-19 17:39:28 +0000 |
commit | e744bc9244e3467463f58db2c0e1b4005792d7d4 (patch) | |
tree | 35c2d540d221e0cd8537f2f5babc4ac85a467d8c | |
parent | 10f0c8cc2f71e1bf141553bacc2883e3d6b15b84 (diff) | |
parent | 57c8b9df52583c21fc56ae278a84826c3e4ace13 (diff) | |
download | libfmq-e744bc9244e3467463f58db2c0e1b4005792d7d4.tar.gz |
Return 0 when read/write ptrs are incorrect am: 57c8b9df52
Original change: https://android-review.googlesource.com/c/platform/system/libfmq/+/2918987
Change-Id: I2b15da5f106ab9e05cdca3a81e3b40269ee04cb0
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | include/fmq/MessageQueueBase.h | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/include/fmq/MessageQueueBase.h b/include/fmq/MessageQueueBase.h index 8144937..ee80a45 100644 --- a/include/fmq/MessageQueueBase.h +++ b/include/fmq/MessageQueueBase.h @@ -1047,6 +1047,12 @@ bool MessageQueueBase<MQDescriptorType, T, flavor>::readBlocking(T* data, size_t template <template <typename, MQFlavor> typename MQDescriptorType, typename T, MQFlavor flavor> size_t MessageQueueBase<MQDescriptorType, T, flavor>::availableToWriteBytes() const { + if (mDesc->getSize() < availableToReadBytes()) { + hardware::details::logError( + "The write or read pointer has become corrupted. Reading from the queue is no " + "longer possible."); + return 0; + } return mDesc->getSize() - availableToReadBytes(); } @@ -1135,6 +1141,12 @@ size_t MessageQueueBase<MQDescriptorType, T, flavor>::availableToReadBytes() con * hence requires a memory_order_acquired load for both mReadPtr and * mWritePtr. */ + if (mWritePtr->load(std::memory_order_acquire) < mReadPtr->load(std::memory_order_acquire)) { + hardware::details::logError( + "The write or read pointer has become corrupted. Reading from the queue is no " + "longer possible."); + return 0; + } return mWritePtr->load(std::memory_order_acquire) - mReadPtr->load(std::memory_order_acquire); } |