Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(438)

Side by Side Diff: gpu/command_buffer/service/gles2_cmd_decoder.cc

Issue 8345003: Make OpenGL string entry points validate the string (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 <stdio.h> 7 #include <stdio.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <list> 10 #include <list>
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 }; 124 };
125 125
126 static bool IsAngle() { 126 static bool IsAngle() {
127 #if defined(OS_WIN) 127 #if defined(OS_WIN)
128 return gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2; 128 return gfx::GetGLImplementation() == gfx::kGLImplementationEGLGLES2;
129 #else 129 #else
130 return false; 130 return false;
131 #endif 131 #endif
132 } 132 }
133 133
134 // Return true if a character belongs to the ASCII subset as defined in
135 // GLSL ES 1.0 spec section 3.1.
136 static bool CharacterIsValidForGLES(unsigned char c) {
137 // Printing characters are valid except " $ ` @ \ ' DEL.
138 if (c >= 32 && c <= 126 &&
139 c != '"' &&
140 c != '$' &&
141 c != '`' &&
142 c != '@' &&
143 c != '\\' &&
144 c != '\'') {
145 return true;
146 }
147 // Horizontal tab, line feed, vertical tab, form feed, carriage return
148 // are also valid.
149 if (c >= 9 && c <= 13) {
150 return true;
151 }
152
153 return false;
154 }
155
156 static bool StringIsValidForGLES(const char* str) {
157 for (; *str; ++str) {
158 if (!CharacterIsValidForGLES(*str)) {
159 return false;
160 }
161 }
162 return true;
163 }
164
134 static void WrappedTexImage2D( 165 static void WrappedTexImage2D(
135 GLenum target, 166 GLenum target,
136 GLint level, 167 GLint level,
137 GLenum internal_format, 168 GLenum internal_format,
138 GLsizei width, 169 GLsizei width,
139 GLsizei height, 170 GLsizei height,
140 GLint border, 171 GLint border,
141 GLenum format, 172 GLenum format,
142 GLenum type, 173 GLenum type,
143 const void* pixels) { 174 const void* pixels) {
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after
792 RenderbufferManager::RenderbufferInfo* info = 823 RenderbufferManager::RenderbufferInfo* info =
793 renderbuffer_manager()->GetRenderbufferInfo(client_id); 824 renderbuffer_manager()->GetRenderbufferInfo(client_id);
794 return (info && !info->IsDeleted()) ? info : NULL; 825 return (info && !info->IsDeleted()) ? info : NULL;
795 } 826 }
796 827
797 // Removes the renderbuffer info for the given renderbuffer. 828 // Removes the renderbuffer info for the given renderbuffer.
798 void RemoveRenderbufferInfo(GLuint client_id) { 829 void RemoveRenderbufferInfo(GLuint client_id) {
799 renderbuffer_manager()->RemoveRenderbufferInfo(client_id); 830 renderbuffer_manager()->RemoveRenderbufferInfo(client_id);
800 } 831 }
801 832
833 void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name);
834
802 error::Error GetAttribLocationHelper( 835 error::Error GetAttribLocationHelper(
803 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, 836 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
804 const std::string& name_str); 837 const std::string& name_str);
805 838
806 error::Error GetUniformLocationHelper( 839 error::Error GetUniformLocationHelper(
807 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, 840 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
808 const std::string& name_str); 841 const std::string& name_str);
809 842
810 // Helper for glShaderSource. 843 // Helper for glShaderSource.
811 error::Error ShaderSourceHelper( 844 error::Error ShaderSourceHelper(
(...skipping 2498 matching lines...) Expand 10 before | Expand all | Expand 10 after
3310 void GLES2DecoderImpl::DoGetProgramiv( 3343 void GLES2DecoderImpl::DoGetProgramiv(
3311 GLuint program_id, GLenum pname, GLint* params) { 3344 GLuint program_id, GLenum pname, GLint* params) {
3312 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( 3345 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
3313 program_id, "glGetProgramiv"); 3346 program_id, "glGetProgramiv");
3314 if (!info) { 3347 if (!info) {
3315 return; 3348 return;
3316 } 3349 }
3317 info->GetProgramiv(pname, params); 3350 info->GetProgramiv(pname, params);
3318 } 3351 }
3319 3352
3353 void GLES2DecoderImpl::DoBindAttribLocation(
3354 GLuint program, GLuint index, const char* name) {
3355 if (!StringIsValidForGLES(name)) {
3356 SetGLError(GL_INVALID_VALUE, "glBindAttribLocation: Invalid character");
3357 return;
3358 }
3359 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
3360 program, "glBindAttribLocation");
3361 if (!info) {
3362 return;
3363 }
3364 glBindAttribLocation(info->service_id(), index, name);
3365 }
3366
3320 error::Error GLES2DecoderImpl::HandleBindAttribLocation( 3367 error::Error GLES2DecoderImpl::HandleBindAttribLocation(
3321 uint32 immediate_data_size, const gles2::BindAttribLocation& c) { 3368 uint32 immediate_data_size, const gles2::BindAttribLocation& c) {
3322 GLuint program = static_cast<GLuint>(c.program); 3369 GLuint program = static_cast<GLuint>(c.program);
3323 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
3324 program, "glBindAttribLocation");
3325 if (!info) {
3326 return error::kNoError;
3327 }
3328 GLuint index = static_cast<GLuint>(c.index); 3370 GLuint index = static_cast<GLuint>(c.index);
3329 uint32 name_size = c.data_size; 3371 uint32 name_size = c.data_size;
3330 const char* name = GetSharedMemoryAs<const char*>( 3372 const char* name = GetSharedMemoryAs<const char*>(
3331 c.name_shm_id, c.name_shm_offset, name_size); 3373 c.name_shm_id, c.name_shm_offset, name_size);
3332 if (name == NULL) { 3374 if (name == NULL) {
3333 return error::kOutOfBounds; 3375 return error::kOutOfBounds;
3334 } 3376 }
3335 String name_str(name, name_size); 3377 String name_str(name, name_size);
3336 glBindAttribLocation(info->service_id(), index, name_str.c_str()); 3378 DoBindAttribLocation(program, index, name_str.c_str());
3337 return error::kNoError; 3379 return error::kNoError;
3338 } 3380 }
3339 3381
3340 error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate( 3382 error::Error GLES2DecoderImpl::HandleBindAttribLocationImmediate(
3341 uint32 immediate_data_size, const gles2::BindAttribLocationImmediate& c) { 3383 uint32 immediate_data_size, const gles2::BindAttribLocationImmediate& c) {
3342 GLuint program = static_cast<GLuint>(c.program); 3384 GLuint program = static_cast<GLuint>(c.program);
3343 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
3344 program, "glBindAttribLocation");
3345 if (!info) {
3346 return error::kNoError;
3347 }
3348 GLuint index = static_cast<GLuint>(c.index); 3385 GLuint index = static_cast<GLuint>(c.index);
3349 uint32 name_size = c.data_size; 3386 uint32 name_size = c.data_size;
3350 const char* name = GetImmediateDataAs<const char*>( 3387 const char* name = GetImmediateDataAs<const char*>(
3351 c, name_size, immediate_data_size); 3388 c, name_size, immediate_data_size);
3352 if (name == NULL) { 3389 if (name == NULL) {
3353 return error::kOutOfBounds; 3390 return error::kOutOfBounds;
3354 } 3391 }
3355 String name_str(name, name_size); 3392 String name_str(name, name_size);
3356 glBindAttribLocation(info->service_id(), index, name_str.c_str()); 3393 DoBindAttribLocation(program, index, name_str.c_str());
3357 return error::kNoError; 3394 return error::kNoError;
3358 } 3395 }
3359 3396
3360 error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket( 3397 error::Error GLES2DecoderImpl::HandleBindAttribLocationBucket(
3361 uint32 immediate_data_size, const gles2::BindAttribLocationBucket& c) { 3398 uint32 immediate_data_size, const gles2::BindAttribLocationBucket& c) {
3362 GLuint program = static_cast<GLuint>(c.program); 3399 GLuint program = static_cast<GLuint>(c.program);
3363 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
3364 program, "glBindAttribLocation");
3365 if (!info) {
3366 return error::kNoError;
3367 }
3368 GLuint index = static_cast<GLuint>(c.index); 3400 GLuint index = static_cast<GLuint>(c.index);
3369 Bucket* bucket = GetBucket(c.name_bucket_id); 3401 Bucket* bucket = GetBucket(c.name_bucket_id);
3370 if (!bucket || bucket->size() == 0) { 3402 if (!bucket || bucket->size() == 0) {
3371 return error::kInvalidArguments; 3403 return error::kInvalidArguments;
3372 } 3404 }
3373 std::string name_str; 3405 std::string name_str;
3374 if (!bucket->GetAsString(&name_str)) { 3406 if (!bucket->GetAsString(&name_str)) {
3375 return error::kInvalidArguments; 3407 return error::kInvalidArguments;
3376 } 3408 }
3377 glBindAttribLocation(info->service_id(), index, name_str.c_str()); 3409 DoBindAttribLocation(program, index, name_str.c_str());
3378 return error::kNoError; 3410 return error::kNoError;
3379 } 3411 }
3380 3412
3381 error::Error GLES2DecoderImpl::HandleDeleteShader( 3413 error::Error GLES2DecoderImpl::HandleDeleteShader(
3382 uint32 immediate_data_size, const gles2::DeleteShader& c) { 3414 uint32 immediate_data_size, const gles2::DeleteShader& c) {
3383 GLuint client_id = c.shader; 3415 GLuint client_id = c.shader;
3384 if (client_id) { 3416 if (client_id) {
3385 ShaderManager::ShaderInfo* info = GetShaderInfo(client_id); 3417 ShaderManager::ShaderInfo* info = GetShaderInfo(client_id);
3386 if (info) { 3418 if (info) {
3387 if (!info->IsDeleted()) { 3419 if (!info->IsDeleted()) {
(...skipping 1285 matching lines...) Expand 10 before | Expand all | Expand 10 after
4673 } 4705 }
4674 return max_vertex_accessed; 4706 return max_vertex_accessed;
4675 } 4707 }
4676 4708
4677 // Calls glShaderSource for the various versions of the ShaderSource command. 4709 // Calls glShaderSource for the various versions of the ShaderSource command.
4678 // Assumes that data / data_size points to a piece of memory that is in range 4710 // Assumes that data / data_size points to a piece of memory that is in range
4679 // of whatever context it came from (shared memory, immediate memory, bucket 4711 // of whatever context it came from (shared memory, immediate memory, bucket
4680 // memory.) 4712 // memory.)
4681 error::Error GLES2DecoderImpl::ShaderSourceHelper( 4713 error::Error GLES2DecoderImpl::ShaderSourceHelper(
4682 GLuint client_id, const char* data, uint32 data_size) { 4714 GLuint client_id, const char* data, uint32 data_size) {
4715 std::string str(data, data + data_size);
4716 if (!StringIsValidForGLES(str.c_str())) {
4717 SetGLError(GL_INVALID_VALUE, "glShaderSource: Invalid character");
4718 return error::kNoError;
4719 }
4683 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram( 4720 ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
4684 client_id, "glShaderSource"); 4721 client_id, "glShaderSource");
4685 if (!info) { 4722 if (!info) {
4686 return error::kNoError; 4723 return error::kNoError;
4687 } 4724 }
4688 // Note: We don't actually call glShaderSource here. We wait until 4725 // Note: We don't actually call glShaderSource here. We wait until
4689 // the call to glCompileShader. 4726 // the call to glCompileShader.
4690 info->UpdateSource(std::string(data, data + data_size).c_str()); 4727 info->UpdateSource(str.c_str());
4691 return error::kNoError; 4728 return error::kNoError;
4692 } 4729 }
4693 4730
4694 error::Error GLES2DecoderImpl::HandleShaderSource( 4731 error::Error GLES2DecoderImpl::HandleShaderSource(
4695 uint32 immediate_data_size, const gles2::ShaderSource& c) { 4732 uint32 immediate_data_size, const gles2::ShaderSource& c) {
4696 uint32 data_size = c.data_size; 4733 uint32 data_size = c.data_size;
4697 const char* data = GetSharedMemoryAs<const char*>( 4734 const char* data = GetSharedMemoryAs<const char*>(
4698 c.data_shm_id, c.data_shm_offset, data_size); 4735 c.data_shm_id, c.data_shm_offset, data_size);
4699 if (!data) { 4736 if (!data) {
4700 return error::kOutOfBounds; 4737 return error::kOutOfBounds;
(...skipping 732 matching lines...) Expand 10 before | Expand all | Expand 10 after
5433 // Validation should have prevented us from getting here. 5470 // Validation should have prevented us from getting here.
5434 NOTREACHED(); 5471 NOTREACHED();
5435 break; 5472 break;
5436 } 5473 }
5437 return error::kNoError; 5474 return error::kNoError;
5438 } 5475 }
5439 5476
5440 error::Error GLES2DecoderImpl::GetAttribLocationHelper( 5477 error::Error GLES2DecoderImpl::GetAttribLocationHelper(
5441 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, 5478 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
5442 const std::string& name_str) { 5479 const std::string& name_str) {
5480 if (!StringIsValidForGLES(name_str.c_str())) {
5481 SetGLError(GL_INVALID_VALUE, "glGetAttribLocation: Invalid character");
5482 return error::kNoError;
5483 }
5443 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( 5484 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
5444 client_id, "glGetAttribLocation"); 5485 client_id, "glGetAttribLocation");
5445 if (!info) { 5486 if (!info) {
5446 return error::kNoError; 5487 return error::kNoError;
5447 } 5488 }
5448 if (!info->IsValid()) { 5489 if (!info->IsValid()) {
5449 SetGLError(GL_INVALID_OPERATION, "glGetAttribLocation: program not linked"); 5490 SetGLError(GL_INVALID_OPERATION, "glGetAttribLocation: program not linked");
5450 return error::kNoError; 5491 return error::kNoError;
5451 } 5492 }
5452 GLint* location = GetSharedMemoryAs<GLint*>( 5493 GLint* location = GetSharedMemoryAs<GLint*>(
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5499 if (!bucket->GetAsString(&name_str)) { 5540 if (!bucket->GetAsString(&name_str)) {
5500 return error::kInvalidArguments; 5541 return error::kInvalidArguments;
5501 } 5542 }
5502 return GetAttribLocationHelper( 5543 return GetAttribLocationHelper(
5503 c.program, c.location_shm_id, c.location_shm_offset, name_str); 5544 c.program, c.location_shm_id, c.location_shm_offset, name_str);
5504 } 5545 }
5505 5546
5506 error::Error GLES2DecoderImpl::GetUniformLocationHelper( 5547 error::Error GLES2DecoderImpl::GetUniformLocationHelper(
5507 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset, 5548 GLuint client_id, uint32 location_shm_id, uint32 location_shm_offset,
5508 const std::string& name_str) { 5549 const std::string& name_str) {
5550 if (!StringIsValidForGLES(name_str.c_str())) {
5551 SetGLError(GL_INVALID_VALUE, "glGetUniformLocation: Invalid character");
5552 return error::kNoError;
5553 }
5509 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader( 5554 ProgramManager::ProgramInfo* info = GetProgramInfoNotShader(
5510 client_id, "glUniformLocation"); 5555 client_id, "glUniformLocation");
5511 if (!info) { 5556 if (!info) {
5512 return error::kNoError; 5557 return error::kNoError;
5513 } 5558 }
5514 if (!info->IsValid()) { 5559 if (!info->IsValid()) {
5515 SetGLError(GL_INVALID_OPERATION, 5560 SetGLError(GL_INVALID_OPERATION,
5516 "glGetUniformLocation: program not linked"); 5561 "glGetUniformLocation: program not linked");
5517 return error::kNoError; 5562 return error::kNoError;
5518 } 5563 }
(...skipping 1606 matching lines...) Expand 10 before | Expand all | Expand 10 after
7125 return error::kNoError; 7170 return error::kNoError;
7126 } 7171 }
7127 7172
7128 // Include the auto-generated part of this file. We split this because it means 7173 // Include the auto-generated part of this file. We split this because it means
7129 // we can easily edit the non-auto generated parts right here in this file 7174 // we can easily edit the non-auto generated parts right here in this file
7130 // instead of having to edit some template or the code generator. 7175 // instead of having to edit some template or the code generator.
7131 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h" 7176 #include "gpu/command_buffer/service/gles2_cmd_decoder_autogen.h"
7132 7177
7133 } // namespace gles2 7178 } // namespace gles2
7134 } // namespace gpu 7179 } // namespace gpu
OLDNEW
« no previous file with comments | « no previous file | gpu/command_buffer/service/gles2_cmd_decoder_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698