diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-17 21:16:28 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-17 21:16:28 +0000 |
commit | 12f93d85e7412f3e846a760a4f3db5edb67ee318 (patch) | |
tree | c317aac1059848abc75ddbafcdd4aa266865f1ea /gpu/command_buffer | |
parent | 6991536a1977d3d6220b07a62dab8c39aaa0b692 (diff) | |
download | chromium_src-12f93d85e7412f3e846a760a4f3db5edb67ee318.zip chromium_src-12f93d85e7412f3e846a760a4f3db5edb67ee318.tar.gz chromium_src-12f93d85e7412f3e846a760a4f3db5edb67ee318.tar.bz2 |
Check for NULL from GetBucket
There were a few places in the code that needed to check for NULL
TEST=unit tests
BUG=58468
Review URL: http://codereview.chromium.org/8320007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@105920 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu/command_buffer')
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 23 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc | 39 |
2 files changed, 61 insertions, 1 deletions
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index ee2e2ca..f98251e 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -5812,9 +5812,18 @@ error::Error GLES2DecoderImpl::HandleCompressedTexImage2DBucket( GLsizei height = static_cast<GLsizei>(c.height); GLint border = static_cast<GLint>(c.border); Bucket* bucket = GetBucket(c.bucket_id); + if (!bucket) { + return error::kInvalidArguments; + } + uint32 data_size = bucket->size(); + GLsizei imageSize = data_size; + const void* data = bucket->GetData(0, data_size); + if (!data) { + return error::kInvalidArguments; + } return DoCompressedTexImage2D( target, level, internal_format, width, height, border, - bucket->size(), bucket->GetData(0, bucket->size())); + imageSize, data); } error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DBucket( @@ -5828,9 +5837,15 @@ error::Error GLES2DecoderImpl::HandleCompressedTexSubImage2DBucket( GLsizei height = static_cast<GLsizei>(c.height); GLenum format = static_cast<GLenum>(c.format); Bucket* bucket = GetBucket(c.bucket_id); + if (!bucket) { + return error::kInvalidArguments; + } uint32 data_size = bucket->size(); GLsizei imageSize = data_size; const void* data = bucket->GetData(0, data_size); + if (!data) { + return error::kInvalidArguments; + } if (!validators_->texture_target.IsValid(target)) { SetGLError( GL_INVALID_ENUM, "glCompressedTexSubImage2D: target GL_INVALID_ENUM"); @@ -6811,6 +6826,9 @@ error::Error GLES2DecoderImpl::HandleSwapBuffers( error::Error GLES2DecoderImpl::HandleEnableFeatureCHROMIUM( uint32 immediate_data_size, const gles2::EnableFeatureCHROMIUM& c) { Bucket* bucket = GetBucket(c.bucket_id); + if (!bucket || bucket->size() == 0) { + return error::kInvalidArguments; + } typedef gles2::EnableFeatureCHROMIUM::Result Result; Result* result = GetSharedMemoryAs<Result*>( c.result_shm_id, c.result_shm_offset, sizeof(*result)); @@ -6865,6 +6883,9 @@ error::Error GLES2DecoderImpl::HandleGetRequestableExtensionsCHROMIUM( error::Error GLES2DecoderImpl::HandleRequestExtensionCHROMIUM( uint32 immediate_data_size, const gles2::RequestExtensionCHROMIUM& c) { Bucket* bucket = GetBucket(c.bucket_id); + if (!bucket || bucket->size() == 0) { + return error::kInvalidArguments; + } std::string feature_str; if (!bucket->GetAsString(&feature_str)) { return error::kInvalidArguments; diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc index c2fb087..16c7d85 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc @@ -4365,6 +4365,31 @@ TEST_F(GLES2DecoderManualInitTest, GetNoCompressedTextureFormats) { EXPECT_EQ(GL_NO_ERROR, GetGLError()); } +TEST_F(GLES2DecoderManualInitTest, CompressedTexImage2DBucketBadBucket) { + InitDecoder( + "GL_EXT_texture_compression_s3tc", // extensions + false, // has alpha + false, // has depth + false, // has stencil + false, // request alpha + false, // request depth + false, // request stencil + true); // bind generates resource + + const uint32 kBadBucketId = 123; + DoBindTexture(GL_TEXTURE_2D, client_texture_id_, kServiceTextureId); + CompressedTexImage2DBucket cmd; + cmd.Init( + GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 4, 4, 0, + kBadBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); + CompressedTexSubImage2DBucket cmd2; + cmd2.Init( + GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, + kBadBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + TEST_F(GLES2DecoderWithShaderTest, GetProgramInfoCHROMIUMValidArgs) { const uint32 kBucketId = 123; GetProgramInfoCHROMIUM cmd; @@ -4871,6 +4896,20 @@ TEST_F(GLES2DecoderManualInitTest, StreamTextureCHROMIUMNullMgr) { GetGLError(); // ignore internal error } +TEST_F(GLES2DecoderTest, EnableFeatureCHROMIUMBadBucket) { + const uint32 kBadBucketId = 123; + EnableFeatureCHROMIUM cmd; + cmd.Init(kBadBucketId, shared_memory_id_, shared_memory_offset_); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + +TEST_F(GLES2DecoderTest, RequestExtensionCHROMIUMBadBucket) { + const uint32 kBadBucketId = 123; + RequestExtensionCHROMIUM cmd; + cmd.Init(kBadBucketId); + EXPECT_NE(error::kNoError, ExecuteCmd(cmd)); +} + // TODO(gman): Complete this test. // TEST_F(GLES2DecoderTest, CompressedTexImage2DGLError) { // } |