OSDN Git Service

Fix glLinkProgram with invalid program name
authorYahan Zhou <yahan@google.com>
Tue, 22 Nov 2016 22:03:56 +0000 (14:03 -0800)
committerYahan Zhou <yahan@google.com>
Tue, 22 Nov 2016 22:59:07 +0000 (14:59 -0800)
glLinkProgram might try setting up program attributes even when an
invalid program name is passed to it. This patch fixes it.

BUG: 33069416
Change-Id: I93ed140095b67df47b158ba837c4aac8eb9e8e50

shared/OpenglCodecCommon/GLSharedGroup.cpp
shared/OpenglCodecCommon/GLSharedGroup.h
system/GLESv2_enc/GL2Encoder.cpp

index 1f7c629..3b5211f 100755 (executable)
@@ -452,6 +452,13 @@ bool GLSharedGroup::setSamplerUniform(GLuint program, GLint appLoc, GLint val, G
     return pData ? pData->setSamplerUniform(appLoc, val, target) : false;
 }
 
+bool  GLSharedGroup::isShader(GLuint shader)
+{
+    android::AutoMutex _lock(m_lock);
+    ShaderData* pData = m_shaders.valueFor(shader);
+    return (pData!=NULL);
+}
+
 bool GLSharedGroup::addShaderData(GLuint shader)
 {
     android::AutoMutex _lock(m_lock);
index b03b40b..4057b52 100755 (executable)
@@ -135,6 +135,7 @@ public:
     GLint   getNextSamplerUniform(GLuint program, GLint index, GLint* val, GLenum* target) const;
     bool    setSamplerUniform(GLuint program, GLint appLoc, GLint val, GLenum* target);
 
+    bool    isShader(GLuint shader);
     bool    addShaderData(GLuint shader);
     // caller must hold a reference to the shader as long as it holds the pointer
     ShaderData* getShaderData(GLuint shader);
index e4fdde8..544c8cc 100755 (executable)
@@ -989,6 +989,10 @@ void GL2Encoder::s_glFinish(void *self)
 void GL2Encoder::s_glLinkProgram(void * self, GLuint program)
 {
     GL2Encoder *ctx = (GL2Encoder *)self;
+    bool isProgram = ctx->m_shared->isProgram(program);
+    SET_ERROR_IF(!isProgram && !ctx->m_shared->isShader(program), GL_INVALID_VALUE);
+    SET_ERROR_IF(!isProgram, GL_INVALID_OPERATION);
+
     ctx->m_glLinkProgram_enc(self, program);
 
     GLint linkStatus = 0;