Tighten context state queries * Ensured integrity of robust queries validation. * Added consistent early exits to Context commands. * Removed unused placeholder variables. Bug: angleproject:410069485 Change-Id: I26504f67cec99a85b9061ccfd4191df53af915e6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/7552873 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
diff --git a/src/libANGLE/Context.cpp b/src/libANGLE/Context.cpp index 4e01753..36a2c84 100644 --- a/src/libANGLE/Context.cpp +++ b/src/libANGLE/Context.cpp
@@ -2584,8 +2584,8 @@ GLenum nativeType; unsigned int numParams; - bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams); - ASSERT(queryStatus); + const bool paramFound = getIndexedQueryParameterInfo(target, &nativeType, &numParams); + ASSERT(paramFound); if (nativeType == GL_INT) { @@ -2630,8 +2630,8 @@ GLenum nativeType; unsigned int numParams; - bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams); - ASSERT(queryStatus); + const bool paramFound = getIndexedQueryParameterInfo(target, &nativeType, &numParams); + ASSERT(paramFound); if (nativeType == GL_INT_64_ANGLEX) { @@ -2655,8 +2655,8 @@ GLenum nativeType; unsigned int numParams; - bool queryStatus = getIndexedQueryParameterInfo(target, &nativeType, &numParams); - ASSERT(queryStatus); + const bool paramFound = getIndexedQueryParameterInfo(target, &nativeType, &numParams); + ASSERT(paramFound); if (nativeType == GL_BOOL) { @@ -7108,7 +7108,11 @@ { GLenum nativeType; unsigned int numParams; - getQueryParameterInfo(pname, &nativeType, &numParams); + const bool paramFound = getQueryParameterInfo(pname, &nativeType, &numParams); + if (ANGLE_UNLIKELY(!paramFound)) + { + return; // Avoid crashing with invalid apps running with no validation. + } if (nativeType == GL_BOOL) { @@ -7134,7 +7138,11 @@ { GLenum nativeType; unsigned int numParams; - getQueryParameterInfo(pname, &nativeType, &numParams); + const bool paramFound = getQueryParameterInfo(pname, &nativeType, &numParams); + if (ANGLE_UNLIKELY(!paramFound)) + { + return; // Avoid crashing with invalid apps running with no validation. + } if (nativeType == GL_FLOAT) { @@ -7160,7 +7168,11 @@ { GLenum nativeType; unsigned int numParams; - getQueryParameterInfo(pname, &nativeType, &numParams); + const bool paramFound = getQueryParameterInfo(pname, &nativeType, &numParams); + if (ANGLE_UNLIKELY(!paramFound)) + { + return; // Avoid crashing with invalid apps running with no validation. + } if (nativeType == GL_INT) { @@ -7948,7 +7960,11 @@ { GLenum nativeType; unsigned int numParams; - getQueryParameterInfo(pname, &nativeType, &numParams); + const bool paramFound = getQueryParameterInfo(pname, &nativeType, &numParams); + if (ANGLE_UNLIKELY(!paramFound)) + { + return; // Avoid crashing with invalid apps running with no validation. + } if (nativeType == GL_INT_64_ANGLEX) {
diff --git a/src/libANGLE/Context_gles_1_0.cpp b/src/libANGLE/Context_gles_1_0.cpp index ef53bfa..fce5ee2 100644 --- a/src/libANGLE/Context_gles_1_0.cpp +++ b/src/libANGLE/Context_gles_1_0.cpp
@@ -57,9 +57,12 @@ void Context::getFixedv(GLenum pname, GLfixed *params) { GLenum nativeType; - unsigned int numParams = 0; - - getQueryParameterInfo(pname, &nativeType, &numParams); + unsigned int numParams; + const bool paramFound = getQueryParameterInfo(pname, &nativeType, &numParams); + if (ANGLE_UNLIKELY(!paramFound)) + { + return; // Avoid crashing with invalid apps running with no validation. + } std::vector<GLfloat> paramsf(numParams, 0); CastStateValues(this, nativeType, pname, numParams, paramsf.data());
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp index 2b290cf..e2726ee 100644 --- a/src/libANGLE/validationES.cpp +++ b/src/libANGLE/validationES.cpp
@@ -2961,7 +2961,7 @@ angle::EntryPoint entryPoint, GLenum pname, const void *data, - unsigned int *outNumParams) + GLsizei *outNumParams) { if (data == nullptr) { @@ -2970,7 +2970,8 @@ } GLenum nativeType; - if (!context->getQueryParameterInfo(pname, &nativeType, outNumParams)) + unsigned int numParams; + if (!context->getQueryParameterInfo(pname, &nativeType, &numParams)) { ANGLE_VALIDATION_ERROR(GL_INVALID_ENUM, kInvalidPname); return false; @@ -3100,6 +3101,11 @@ break; } + if (outNumParams != nullptr) + { + *outNumParams = numParams; + } + return true; } @@ -3155,11 +3161,13 @@ GLsizei paramCount, const void *data) { - unsigned int numParams; + // Make sure ValidateStateQuery sets numParams + GLsizei numParams = std::numeric_limits<GLsizei>::max(); if (!ValidateStateQuery(context, entryPoint, pname, data, &numParams)) { return false; } + ASSERT(numParams != std::numeric_limits<GLsizei>::max()); if (!ValidateRobustParamCount(context, entryPoint, paramCount, numParams)) {
diff --git a/src/libANGLE/validationES.h b/src/libANGLE/validationES.h index 8b46a27..9499e42 100644 --- a/src/libANGLE/validationES.h +++ b/src/libANGLE/validationES.h
@@ -328,7 +328,7 @@ angle::EntryPoint entryPoint, GLenum pname, const void *data, - unsigned int *outNumParams); + GLsizei *outNumParams); bool ValidateRobustStateQuery(const Context *context, angle::EntryPoint entryPoint, GLenum pname,
diff --git a/src/libANGLE/validationES1.cpp b/src/libANGLE/validationES1.cpp index f10ab2a..9318ded 100644 --- a/src/libANGLE/validationES1.cpp +++ b/src/libANGLE/validationES1.cpp
@@ -926,8 +926,7 @@ GLenum pname, const GLfixed *params) { - unsigned int numParams; - return ValidateStateQuery(context, entryPoint, pname, params, &numParams); + return ValidateStateQuery(context, entryPoint, pname, params, nullptr); } bool ValidateGetLightfv(const PrivateState &state,
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp index 38bd2c6..781e3cd 100644 --- a/src/libANGLE/validationES2.cpp +++ b/src/libANGLE/validationES2.cpp
@@ -4580,8 +4580,7 @@ GLenum pname, const GLboolean *data) { - unsigned int numParams; - return ValidateStateQuery(context, entryPoint, pname, data, &numParams); + return ValidateStateQuery(context, entryPoint, pname, data, nullptr); } bool ValidateGetError(const Context *context, angle::EntryPoint entryPoint) @@ -4594,8 +4593,7 @@ GLenum pname, const GLfloat *data) { - unsigned int numParams; - return ValidateStateQuery(context, entryPoint, pname, data, &numParams); + return ValidateStateQuery(context, entryPoint, pname, data, nullptr); } bool ValidateGetIntegerv(const Context *context, @@ -4603,8 +4601,7 @@ GLenum pname, const GLint *data) { - unsigned int numParams; - return ValidateStateQuery(context, entryPoint, pname, data, &numParams); + return ValidateStateQuery(context, entryPoint, pname, data, nullptr); } bool ValidateGetProgramInfoLog(const Context *context,
diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp index f3896e1..81ce322 100644 --- a/src/libANGLE/validationES3.cpp +++ b/src/libANGLE/validationES3.cpp
@@ -3227,11 +3227,13 @@ return false; } - GLsizei numParams; + // Make sure ValidateIndexedStateQuery sets numParams + GLsizei numParams = std::numeric_limits<GLsizei>::max(); if (!ValidateIndexedStateQuery(context, entryPoint, target, index, data, &numParams)) { return false; } + ASSERT(numParams != std::numeric_limits<GLsizei>::max()); if (!ValidateRobustParamCount(context, entryPoint, paramCount, numParams)) { @@ -3264,11 +3266,13 @@ return false; } - GLsizei numParams; + // Make sure ValidateIndexedStateQuery sets numParams + GLsizei numParams = std::numeric_limits<GLsizei>::max(); if (!ValidateIndexedStateQuery(context, entryPoint, target, index, data, &numParams)) { return false; } + ASSERT(numParams != std::numeric_limits<GLsizei>::max()); if (!ValidateRobustParamCount(context, entryPoint, paramCount, numParams)) { @@ -4550,8 +4554,7 @@ GLenum pname, const GLint64 *data) { - unsigned int numParams; - return ValidateStateQuery(context, entryPoint, pname, data, &numParams); + return ValidateStateQuery(context, entryPoint, pname, data, nullptr); } bool ValidateIsSampler(const Context *context, angle::EntryPoint entryPoint, SamplerID sampler)
diff --git a/src/libANGLE/validationESEXT.cpp b/src/libANGLE/validationESEXT.cpp index 49961dc..8873a69 100644 --- a/src/libANGLE/validationESEXT.cpp +++ b/src/libANGLE/validationESEXT.cpp
@@ -1088,8 +1088,7 @@ GLenum pname, const GLint64 *data) { - unsigned int numParams; - return ValidateStateQuery(context, entryPoint, pname, data, &numParams); + return ValidateStateQuery(context, entryPoint, pname, data, nullptr); } bool ValidateCopyImageSubDataEXT(const Context *context,