Chromium Code Reviews| Index: media/mojo/services/mojo_cdm_allocator.cc |
| diff --git a/media/mojo/services/mojo_cdm_allocator.cc b/media/mojo/services/mojo_cdm_allocator.cc |
| index 71a3df118d7a02cc01252fb5eeec9c70849b21bf..f3791d2e20f338c20d2086b864d2b3eefa8c6b05 100644 |
| --- a/media/mojo/services/mojo_cdm_allocator.cc |
| +++ b/media/mojo/services/mojo_cdm_allocator.cc |
| @@ -4,8 +4,11 @@ |
| #include "media/mojo/services/mojo_cdm_allocator.h" |
| +#include <limits> |
| + |
| #include "base/callback.h" |
| #include "base/compiler_specific.h" |
| +#include "base/numerics/safe_conversions.h" |
| #include "base/numerics/safe_math.h" |
| #include "media/cdm/api/content_decryption_module.h" |
| #include "media/cdm/cdm_helpers.h" |
| @@ -20,7 +23,7 @@ namespace media { |
| namespace { |
| typedef base::Callback<void(mojo::ScopedSharedBufferHandle buffer, |
| - uint32_t capacity)> |
| + size_t capacity)> |
| MojoSharedBufferDoneCB; |
| VideoPixelFormat CdmVideoFormatToVideoPixelFormat(cdm::VideoFormat format) { |
| @@ -41,11 +44,18 @@ class MojoCdmBuffer : public cdm::Buffer { |
| public: |
| static MojoCdmBuffer* Create( |
| mojo::ScopedSharedBufferHandle buffer, |
| - uint32_t capacity, |
| + size_t capacity, |
| const MojoSharedBufferDoneCB& mojo_shared_buffer_done_cb) { |
| DCHECK(buffer.is_valid()); |
| DCHECK(!mojo_shared_buffer_done_cb.is_null()); |
| - return new MojoCdmBuffer(std::move(buffer), capacity, |
| + |
| + // cdm::Buffer interface limits capacity to uint32. Requests bigger than |
| + // uint32_max will fail. |
| + if (capacity > static_cast<size_t>(std::numeric_limits<uint32_t>::max())) |
| + return nullptr; |
|
xhwang
2016/03/15 06:17:22
ditto
jrummell
2016/03/15 18:49:42
Done.
|
| + |
| + return new MojoCdmBuffer(std::move(buffer), |
| + base::checked_cast<uint32_t>(capacity), |
| mojo_shared_buffer_done_cb); |
| } |
| @@ -166,7 +176,7 @@ MojoCdmAllocator::~MojoCdmAllocator() {} |
| // Creates a cdm::Buffer, reusing an existing buffer if one is available. |
| // If not, a new buffer is created using AllocateNewBuffer(). The caller is |
| // responsible for calling Destroy() on the buffer when it is no longer needed. |
| -cdm::Buffer* MojoCdmAllocator::CreateCdmBuffer(uint32_t capacity) { |
| +cdm::Buffer* MojoCdmAllocator::CreateCdmBuffer(size_t capacity) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| if (!capacity) |
| @@ -204,15 +214,15 @@ scoped_ptr<VideoFrameImpl> MojoCdmAllocator::CreateCdmVideoFrame() { |
| } |
| mojo::ScopedSharedBufferHandle MojoCdmAllocator::AllocateNewBuffer( |
| - uint32_t* capacity) { |
| + size_t* capacity) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| // Always pad new allocated buffer so that we don't need to reallocate |
| // buffers frequently if requested sizes fluctuate slightly. |
| - static const uint32_t kBufferPadding = 512; |
| + static const size_t kBufferPadding = 512; |
| // Maximum number of free buffers we can keep when allocating new buffers. |
| - static const uint32_t kFreeLimit = 3; |
| + static const size_t kFreeLimit = 3; |
| // Destroy the smallest buffer before allocating a new bigger buffer if the |
| // number of free buffers exceeds a limit. This mechanism helps avoid ending |
| @@ -224,7 +234,7 @@ mojo::ScopedSharedBufferHandle MojoCdmAllocator::AllocateNewBuffer( |
| // Creation of shared memory may be expensive if it involves synchronous IPC |
| // calls. That's why we try to avoid AllocateNewBuffer() as much as we can. |
| mojo::ScopedSharedBufferHandle handle; |
| - base::CheckedNumeric<uint32_t> requested_capacity(*capacity); |
| + base::CheckedNumeric<size_t> requested_capacity(*capacity); |
| requested_capacity += kBufferPadding; |
| MojoResult result = mojo::CreateSharedBuffer( |
| nullptr, requested_capacity.ValueOrDie(), &handle); |
| @@ -237,7 +247,7 @@ mojo::ScopedSharedBufferHandle MojoCdmAllocator::AllocateNewBuffer( |
| void MojoCdmAllocator::AddBufferToAvailableMap( |
| mojo::ScopedSharedBufferHandle buffer, |
| - uint32_t capacity) { |
| + size_t capacity) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| available_buffers_.insert(std::make_pair(capacity, std::move(buffer))); |
| } |