Fix glLinkProgram with invalid program name
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
diff --git a/shared/OpenglCodecCommon/GLSharedGroup.cpp b/shared/OpenglCodecCommon/GLSharedGroup.cpp
index 1f7c629..3b5211f 100755
--- a/shared/OpenglCodecCommon/GLSharedGroup.cpp
+++ b/shared/OpenglCodecCommon/GLSharedGroup.cpp
@@ -452,6 +452,13 @@
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);
diff --git a/shared/OpenglCodecCommon/GLSharedGroup.h b/shared/OpenglCodecCommon/GLSharedGroup.h
index b03b40b..4057b52 100755
--- a/shared/OpenglCodecCommon/GLSharedGroup.h
+++ b/shared/OpenglCodecCommon/GLSharedGroup.h
@@ -135,6 +135,7 @@
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);
diff --git a/system/GLESv2_enc/GL2Encoder.cpp b/system/GLESv2_enc/GL2Encoder.cpp
index e4fdde8..544c8cc 100755
--- a/system/GLESv2_enc/GL2Encoder.cpp
+++ b/system/GLESv2_enc/GL2Encoder.cpp
@@ -989,6 +989,10 @@
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;