mesa: Fix performance query id check
authorRobert Bragg <robert@sixbynine.org>
Fri, 24 Feb 2017 16:39:06 +0000 (16:39 +0000)
committerRobert Bragg <robert@sixbynine.org>
Wed, 1 Mar 2017 23:01:48 +0000 (23:01 +0000)
The queryid_valid() function asserts that an ID given by an application
isn't zero since the spec explicitly reserves an ID of zero as invalid.

The implementation was written as if the ID was a signed integer and
based on the assumption that queryid_to_index() is simply subtracting
one from the ID. It was broken because in fact the ID was stored in an
unsigned int and testing for an index >= 0 would always succeed.

This adds a spec quote to clarify why zero is considered invalid and
checks for zero before even passing the ID to queryid_to_index() for
then checking the upper bound.

This is a v2 of a patch originally posted by Juha-Pekka (thanks)

Cc: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Signed-off-by: Robert Bragg <robert@sixbynine.org>
Reviewed-by: Plamena Manolova <plamena.manolova@intel.com>
src/mesa/main/performance_query.c

index aa103516a58ec8e5c93e4a41613c84b24777b808..56f6a7da8b9fabf951ff732d152b75c2811ad284 100644 (file)
@@ -90,8 +90,12 @@ index_to_queryid(unsigned index)
 static inline bool
 queryid_valid(const struct gl_context *ctx, unsigned numQueries, GLuint queryid)
 {
-   GLuint index = queryid_to_index(queryid);
-   return index >= 0 && index < numQueries;
+   /* The GL_INTEL_performance_query spec says:
+    *
+    *  "Performance counter ids values start with 1. Performance counter id 0
+    *  is reserved as an invalid counter."
+    */
+   return queryid != 0 && queryid_to_index(queryid) < numQueries;
 }
 
 static inline GLuint