Merge "Legacy wrapper: Use arbitrary limit on buffer size" into oc-mr1-dev

This commit is contained in:
TreeHugger Robot
2017-10-10 23:43:35 +00:00
committed by Android (Google) Code Review
3 changed files with 14 additions and 16 deletions

View File

@@ -49,6 +49,13 @@ using ::android::sp;
struct Stream : public IStream, public ParametersUtil {
explicit Stream(audio_stream_t* stream);
/** 1GiB is the maximum buffer size the HAL client is allowed to request.
* This value has been chosen to be under SIZE_MAX and still big enough
* for all audio use case.
* Keep private for 2.0, put in .hal in 2.1
*/
static constexpr uint32_t MAX_BUFFER_SIZE = 2 << 30 /* == 1GiB */;
// Methods from ::android::hardware::audio::V2_0::IStream follow.
Return<uint64_t> getFrameSize() override;
Return<uint64_t> getFrameCount() override;

View File

@@ -347,14 +347,10 @@ Return<void> StreamIn::prepareForReading(uint32_t frameSize,
sendError(Result::INVALID_ARGUMENTS);
return Void();
}
// A message queue asserts if it can not handle the requested buffer,
// thus the client has to guess the maximum size it can handle
// Choose an arbitrary margin for the overhead of a message queue
size_t metadataOverhead = 100000;
if (frameSize >
(std::numeric_limits<size_t>::max() - metadataOverhead) / framesCount) {
ALOGE("Buffer too big: %u*%u bytes can not fit in a message queue",
frameSize, framesCount);
if (frameSize > Stream::MAX_BUFFER_SIZE / framesCount) {
ALOGE("Buffer too big: %u*%u bytes > MAX_BUFFER_SIZE (%u)", frameSize, framesCount,
Stream::MAX_BUFFER_SIZE);
sendError(Result::INVALID_ARGUMENTS);
return Void();
}

View File

@@ -323,14 +323,9 @@ Return<void> StreamOut::prepareForWriting(uint32_t frameSize,
sendError(Result::INVALID_ARGUMENTS);
return Void();
}
// A message queue asserts if it can not handle the requested buffer,
// thus the client has to guess the maximum size it can handle
size_t metadataOverhead =
100000; // Arbitrary margin for the overhead of a message queue
if (frameSize >
(std::numeric_limits<size_t>::max() - metadataOverhead) / framesCount) {
ALOGE("Buffer too big: %u*%u bytes can not fit in a message queue",
frameSize, framesCount);
if (frameSize > Stream::MAX_BUFFER_SIZE / framesCount) {
ALOGE("Buffer too big: %u*%u bytes > MAX_BUFFER_SIZE (%u)", frameSize, framesCount,
Stream::MAX_BUFFER_SIZE);
sendError(Result::INVALID_ARGUMENTS);
return Void();
}