#include "content/renderer/pepper/pepper_media_stream_track_host_base.h"
#include "base/logging.h"
+#include "base/numerics/safe_math.h"
#include "content/public/renderer/render_thread.h"
#include "content/public/renderer/renderer_ppapi_host.h"
#include "ppapi/c/pp_errors.h"
DCHECK_GT(buffer_size,
static_cast<int32_t>(sizeof(ppapi::MediaStreamBuffer::Header)));
// Make each buffer 4 byte aligned.
- buffer_size = (buffer_size + 3) & ~0x3;
+ base::CheckedNumeric<int32_t> buffer_size_aligned = buffer_size;
+ // TODO(amistry): "buffer size" might not == "buffer stride", in the same way
+ // that width != stride in an image buffer.
+ buffer_size_aligned += (4 - buffer_size % 4);
// TODO(penghuang): |HostAllocateSharedMemoryBuffer| uses sync IPC. We should
// avoid it.
- int32_t size = number_of_buffers * buffer_size;
+ base::CheckedNumeric<int32_t> size = number_of_buffers * buffer_size_aligned;
+ if (!size.IsValid())
+ return false;
+
content::RenderThread* render_thread = content::RenderThread::Get();
scoped_ptr<base::SharedMemory> shm(
- render_thread->HostAllocateSharedMemoryBuffer(size).Pass());
+ render_thread->HostAllocateSharedMemoryBuffer(size.ValueOrDie()).Pass());
if (!shm)
return false;
base::SharedMemoryHandle shm_handle = shm->handle();
- if (!buffer_manager_.SetBuffers(
- number_of_buffers, buffer_size, shm.Pass(), true)) {
+ if (!buffer_manager_.SetBuffers(number_of_buffers,
+ buffer_size_aligned.ValueOrDie(),
+ shm.Pass(),
+ true)) {
return false;
}
#error Not implemented.
#endif
SerializedHandle handle(host_->ShareHandleWithRemote(platform_file, false),
- size);
+ size.ValueOrDie());
bool readonly = (track_type == kRead);
host()->SendUnsolicitedReplyWithHandles(
pp_resource(),
- PpapiPluginMsg_MediaStreamTrack_InitBuffers(number_of_buffers,
- buffer_size,
- readonly),
+ PpapiPluginMsg_MediaStreamTrack_InitBuffers(
+ number_of_buffers,
+ buffer_size_aligned.ValueOrDie(),
+ readonly),
std::vector<SerializedHandle>(1, handle));
return true;
}
int32_t PepperMediaStreamTrackHostBase::OnResourceMessageReceived(
const IPC::Message& msg,
HostMessageContext* context) {
- IPC_BEGIN_MESSAGE_MAP(PepperMediaStreamTrackHostBase, msg)
- PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_MediaStreamTrack_EnqueueBuffer,
- OnHostMsgEnqueueBuffer)
- PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_MediaStreamTrack_Close,
- OnHostMsgClose)
- IPC_END_MESSAGE_MAP()
+ PPAPI_BEGIN_MESSAGE_MAP(PepperMediaStreamTrackHostBase, msg)
+ PPAPI_DISPATCH_HOST_RESOURCE_CALL(
+ PpapiHostMsg_MediaStreamTrack_EnqueueBuffer, OnHostMsgEnqueueBuffer)
+ PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_MediaStreamTrack_Close,
+ OnHostMsgClose)
+ PPAPI_END_MESSAGE_MAP()
return ppapi::host::ResourceHost::OnResourceMessageReceived(msg, context);
}