Index: content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc |
diff --git a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc |
index 5572c1fa2a92ab8422d61ebe7d65efef2b0818ae..2f95d61ebfe77356084c2b8bbf120805622463c1 100644 |
--- a/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc |
+++ b/content/common/gpu/client/gpu_memory_buffer_impl_shared_memory.cc |
@@ -35,7 +35,17 @@ scoped_ptr<GpuMemoryBufferImpl> GpuMemoryBufferImplSharedMemory::Create( |
const gfx::Size& size, |
Format format) { |
scoped_ptr<base::SharedMemory> shared_memory(new base::SharedMemory()); |
- if (!shared_memory->CreateAnonymous(size.GetArea() * BytesPerPixel(format))) |
+ |
+ size_t stride_in_bytes = 0; |
+ if (!StrideInBytes(size.width(), format, &stride_in_bytes)) |
+ return scoped_ptr<GpuMemoryBufferImpl>(); |
+ |
+ base::CheckedNumeric<size_t> size_in_bytes = stride_in_bytes; |
+ size_in_bytes *= size.height(); |
+ if (!size_in_bytes.IsValid()) |
+ return scoped_ptr<GpuMemoryBufferImpl>(); |
+ |
+ if (!shared_memory->CreateAnonymous(size_in_bytes.ValueOrDie())) |
return scoped_ptr<GpuMemoryBufferImpl>(); |
return make_scoped_ptr(new GpuMemoryBufferImplSharedMemory( |
@@ -49,9 +59,12 @@ GpuMemoryBufferImplSharedMemory::AllocateForChildProcess( |
const gfx::Size& size, |
Format format, |
base::ProcessHandle child_process) { |
- base::CheckedNumeric<int> buffer_size = size.width(); |
+ size_t stride_in_bytes = 0; |
+ if (!StrideInBytes(size.width(), format, &stride_in_bytes)) |
+ return gfx::GpuMemoryBufferHandle(); |
+ |
+ base::CheckedNumeric<int> buffer_size = stride_in_bytes; |
buffer_size *= size.height(); |
- buffer_size *= BytesPerPixel(format); |
if (!buffer_size.IsValid()) |
return gfx::GpuMemoryBufferHandle(); |
@@ -101,7 +114,17 @@ bool GpuMemoryBufferImplSharedMemory::IsFormatSupported(Format format) { |
void* GpuMemoryBufferImplSharedMemory::Map() { |
DCHECK(!mapped_); |
- if (!shared_memory_->Map(size_.GetArea() * BytesPerPixel(format_))) |
+ |
+ size_t stride_in_bytes = 0; |
+ if (!StrideInBytes(size_.width(), format_, &stride_in_bytes)) |
+ return NULL; |
+ |
+ base::CheckedNumeric<size_t> size_in_bytes = stride_in_bytes; |
+ size_in_bytes *= size_.height(); |
+ if (!size_in_bytes.IsValid()) |
+ return NULL; |
+ |
+ if (!shared_memory_->Map(size_in_bytes.ValueOrDie())) |
return NULL; |
mapped_ = true; |
return shared_memory_->memory(); |
@@ -114,7 +137,10 @@ void GpuMemoryBufferImplSharedMemory::Unmap() { |
} |
uint32 GpuMemoryBufferImplSharedMemory::GetStride() const { |
- return size_.width() * BytesPerPixel(format_); |
+ size_t stride_in_bytes = 0; |
+ bool valid_stride = StrideInBytes(size_.width(), format_, &stride_in_bytes); |
+ DCHECK(valid_stride); |
+ return stride_in_bytes; |
} |
gfx::GpuMemoryBufferHandle GpuMemoryBufferImplSharedMemory::GetHandle() const { |