Snap for 11685116 from e7617177a313cc9d9ad219424b41e8a58ee7dd15 to mainline-adservices-release Change-Id: I384cd36664abb6384673b9bcbee428d860186787
diff --git a/include/fmq/MessageQueueBase.h b/include/fmq/MessageQueueBase.h index f99e335..7a027ec 100644 --- a/include/fmq/MessageQueueBase.h +++ b/include/fmq/MessageQueueBase.h
@@ -1044,8 +1044,16 @@ } template <template <typename, MQFlavor> typename MQDescriptorType, typename T, MQFlavor flavor> -size_t MessageQueueBase<MQDescriptorType, T, flavor>::availableToWriteBytes() const { - return mDesc->getSize() - availableToReadBytes(); +inline size_t MessageQueueBase<MQDescriptorType, T, flavor>::availableToWriteBytes() const { + size_t queueSizeBytes = mDesc->getSize(); + size_t availableBytes = availableToReadBytes(); + if (queueSizeBytes < availableBytes) { + hardware::details::logError( + "The write or read pointer has become corrupted. Reading from the queue is no " + "longer possible."); + return 0; + } + return queueSizeBytes - availableBytes; } template <template <typename, MQFlavor> typename MQDescriptorType, typename T, MQFlavor flavor> @@ -1127,13 +1135,21 @@ } template <template <typename, MQFlavor> typename MQDescriptorType, typename T, MQFlavor flavor> -size_t MessageQueueBase<MQDescriptorType, T, flavor>::availableToReadBytes() const { +inline size_t MessageQueueBase<MQDescriptorType, T, flavor>::availableToReadBytes() const { /* * This method is invoked by implementations of both read() and write() and * hence requires a memory_order_acquired load for both mReadPtr and * mWritePtr. */ - return mWritePtr->load(std::memory_order_acquire) - mReadPtr->load(std::memory_order_acquire); + uint64_t writePtr = mWritePtr->load(std::memory_order_acquire); + uint64_t readPtr = mReadPtr->load(std::memory_order_acquire); + if (writePtr < readPtr) { + hardware::details::logError( + "The write or read pointer has become corrupted. Reading from the queue is no " + "longer possible."); + return 0; + } + return writePtr - readPtr; } template <template <typename, MQFlavor> typename MQDescriptorType, typename T, MQFlavor flavor>