OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" | 5 #include "gpu/command_buffer/service/gles2_cmd_decoder.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 #include <stdio.h> | 10 #include <stdio.h> |
(...skipping 12078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12089 } | 12089 } |
12090 | 12090 |
12091 GLsizei num_textures = c.num_textures; | 12091 GLsizei num_textures = c.num_textures; |
12092 if (num_textures < 0 || num_textures > 4) { | 12092 if (num_textures < 0 || num_textures > 4) { |
12093 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glScheduleDCLayerCHROMIUM", | 12093 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glScheduleDCLayerCHROMIUM", |
12094 "number of textures greater than maximum of 4"); | 12094 "number of textures greater than maximum of 4"); |
12095 return error::kNoError; | 12095 return error::kNoError; |
12096 } | 12096 } |
12097 | 12097 |
12098 size_t textures_size = num_textures * sizeof(GLuint); | 12098 size_t textures_size = num_textures * sizeof(GLuint); |
| 12099 GLsizei color_space_size = c.color_space_size; |
12099 | 12100 |
12100 base::CheckedNumeric<uint32_t> data_size = textures_size; | 12101 base::CheckedNumeric<uint32_t> data_size = textures_size; |
12101 const uint32_t kRectDataSize = 8 * sizeof(GLfloat); | 12102 const uint32_t kRectDataSize = 8 * sizeof(GLfloat); |
12102 data_size += kRectDataSize; | 12103 data_size += kRectDataSize; |
| 12104 data_size += color_space_size; |
12103 if (!data_size.IsValid()) | 12105 if (!data_size.IsValid()) |
12104 return error::kOutOfBounds; | 12106 return error::kOutOfBounds; |
12105 const void* data = | 12107 const void* data = |
12106 GetAddressAndCheckSize(c.shm_id, c.shm_offset, data_size.ValueOrDie()); | 12108 GetAddressAndCheckSize(c.shm_id, c.shm_offset, data_size.ValueOrDie()); |
12107 if (!data) { | 12109 if (!data) { |
12108 return error::kOutOfBounds; | 12110 return error::kOutOfBounds; |
12109 } | 12111 } |
12110 const GLfloat* mem = reinterpret_cast<const GLfloat*>(data); | 12112 const GLfloat* mem = reinterpret_cast<const GLfloat*>(data); |
12111 | 12113 |
12112 gfx::RectF contents_rect(mem[0], mem[1], mem[2], mem[3]); | 12114 gfx::RectF contents_rect(mem[0], mem[1], mem[2], mem[3]); |
(...skipping 18 matching lines...) Expand all Loading... |
12131 &image_state); | 12133 &image_state); |
12132 if (!image) { | 12134 if (!image) { |
12133 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScheduleDCLayerCHROMIUM", | 12135 LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glScheduleDCLayerCHROMIUM", |
12134 "unsupported texture format"); | 12136 "unsupported texture format"); |
12135 return error::kNoError; | 12137 return error::kNoError; |
12136 } | 12138 } |
12137 } | 12139 } |
12138 images.push_back(image); | 12140 images.push_back(image); |
12139 } | 12141 } |
12140 | 12142 |
| 12143 volatile const char* volatile_color_space_data = |
| 12144 reinterpret_cast<volatile const char*>(data) + kRectDataSize + |
| 12145 textures_size; |
| 12146 |
| 12147 // Make a copy to reduce the risk of a time of check to time of use attack. |
| 12148 std::vector<char> color_space_data( |
| 12149 volatile_color_space_data, volatile_color_space_data + color_space_size); |
| 12150 base::Pickle color_space_pickle(color_space_data.data(), color_space_size); |
| 12151 base::PickleIterator iterator(color_space_pickle); |
| 12152 gfx::ColorSpace color_space; |
| 12153 if (!color_space.ReadFromPickle(&iterator)) |
| 12154 return error::kOutOfBounds; |
| 12155 |
12141 ui::DCRendererLayerParams params = ui::DCRendererLayerParams( | 12156 ui::DCRendererLayerParams params = ui::DCRendererLayerParams( |
12142 dc_layer_shared_state_->is_clipped, dc_layer_shared_state_->clip_rect, | 12157 dc_layer_shared_state_->is_clipped, dc_layer_shared_state_->clip_rect, |
12143 dc_layer_shared_state_->z_order, dc_layer_shared_state_->transform, | 12158 dc_layer_shared_state_->z_order, dc_layer_shared_state_->transform, |
12144 images, contents_rect, gfx::ToEnclosingRect(bounds_rect), | 12159 images, contents_rect, gfx::ToEnclosingRect(bounds_rect), |
12145 c.background_color, c.edge_aa_mask, dc_layer_shared_state_->opacity, | 12160 c.background_color, c.edge_aa_mask, dc_layer_shared_state_->opacity, |
12146 filter); | 12161 filter, color_space); |
12147 if (!surface_->ScheduleDCLayer(params)) { | 12162 if (!surface_->ScheduleDCLayer(params)) { |
12148 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glScheduleDCLayerCHROMIUM", | 12163 LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, "glScheduleDCLayerCHROMIUM", |
12149 "failed to schedule DCLayer"); | 12164 "failed to schedule DCLayer"); |
12150 } | 12165 } |
12151 return error::kNoError; | 12166 return error::kNoError; |
12152 } | 12167 } |
12153 | 12168 |
12154 void GLES2DecoderImpl::DoScheduleCALayerInUseQueryCHROMIUM( | 12169 void GLES2DecoderImpl::DoScheduleCALayerInUseQueryCHROMIUM( |
12155 GLsizei count, | 12170 GLsizei count, |
12156 const volatile GLuint* textures) { | 12171 const volatile GLuint* textures) { |
(...skipping 7483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19640 } | 19655 } |
19641 | 19656 |
19642 // Include the auto-generated part of this file. We split this because it means | 19657 // Include the auto-generated part of this file. We split this because it means |
19643 // we can easily edit the non-auto generated parts right here in this file | 19658 // we can easily edit the non-auto generated parts right here in this file |
19644 // instead of having to edit some template or the code generator. | 19659 // instead of having to edit some template or the code generator. |
19645 #include "base/macros.h" | 19660 #include "base/macros.h" |
19646 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" | 19661 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" |
19647 | 19662 |
19648 } // namespace gles2 | 19663 } // namespace gles2 |
19649 } // namespace gpu | 19664 } // namespace gpu |
OLD | NEW |