Index: gpu/command_buffer/service/query_manager.cc |
diff --git a/gpu/command_buffer/service/query_manager.cc b/gpu/command_buffer/service/query_manager.cc |
index 5d5757769f4457a2cac8bd2107b8874ab7c22a36..94f31fa6a2ac930f22461263a5155d19f92bbcfe 100644 |
--- a/gpu/command_buffer/service/query_manager.cc |
+++ b/gpu/command_buffer/service/query_manager.cc |
@@ -8,6 +8,7 @@ |
#include "base/bind.h" |
#include "base/logging.h" |
#include "base/memory/shared_memory.h" |
+#include "base/numerics/safe_math.h" |
#include "base/synchronization/lock.h" |
#include "base/time/time.h" |
#include "gpu/command_buffer/common/gles2_cmd_format.h" |
@@ -95,8 +96,9 @@ bool AsyncPixelTransfersCompletedQuery::End( |
mem_params.shm_size = buffer.size; |
mem_params.shm_data_offset = shm_offset(); |
mem_params.shm_data_size = sizeof(QuerySync); |
- uint32 end = mem_params.shm_data_offset + mem_params.shm_data_size; |
- if (end > mem_params.shm_size || end < mem_params.shm_data_offset) |
+ base::CheckedNumeric<uint32> end = mem_params.shm_data_offset; |
+ end += mem_params.shm_data_size; |
+ if (!end.IsValid() || end.ValueOrDie() > mem_params.shm_size) |
return false; |
observer_ = new AsyncPixelTransferCompletionObserverImpl(submit_count); |
@@ -304,11 +306,17 @@ class AsyncReadPixelsCompletedQuery |
protected: |
void Complete(); |
virtual ~AsyncReadPixelsCompletedQuery(); |
+ |
+ private: |
+ bool completed_; |
+ bool complete_result_; |
}; |
AsyncReadPixelsCompletedQuery::AsyncReadPixelsCompletedQuery( |
QueryManager* manager, GLenum target, int32 shm_id, uint32 shm_offset) |
- : Query(manager, target, shm_id, shm_offset) { |
+ : Query(manager, target, shm_id, shm_offset), |
+ completed_(false), |
+ complete_result_(false) { |
} |
bool AsyncReadPixelsCompletedQuery::Begin() { |
@@ -323,15 +331,16 @@ bool AsyncReadPixelsCompletedQuery::End(base::subtle::Atomic32 submit_count) { |
base::Bind(&AsyncReadPixelsCompletedQuery::Complete, |
AsWeakPtr())); |
- return true; |
+ return Process(); |
} |
void AsyncReadPixelsCompletedQuery::Complete() { |
- MarkAsCompleted(1); |
+ completed_ = true; |
+ complete_result_ = MarkAsCompleted(1); |
} |
bool AsyncReadPixelsCompletedQuery::Process() { |
- return true; |
+ return !completed_ || complete_result_; |
} |
void AsyncReadPixelsCompletedQuery::Destroy(bool /* have_context */) { |