mesa: validate shader binary format in _mesa_spirv_shader_binary
authorTapani Pälli <tapani.palli@intel.com>
Tue, 23 May 2023 05:28:40 +0000 (08:28 +0300)
committerMarge Bot <emma+marge@anholt.net>
Wed, 24 May 2023 06:45:39 +0000 (06:45 +0000)
Rework:
 * Jordan: Added ARB_gl_spirv text to comment.

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23155>

src/mesa/main/glspirv.c

index 949962a..73e4abc 100644 (file)
@@ -74,6 +74,25 @@ _mesa_spirv_shader_binary(struct gl_context *ctx,
    struct gl_spirv_module *module;
    struct gl_shader_spirv_data *spirv_data;
 
+   /* From OpenGL 4.6 Core spec, "7.2 Shader Binaries" :
+    *
+    * "An INVALID_VALUE error is generated if the data pointed to by binary
+    *  does not match the specified binaryformat."
+    *
+    * However, the ARB_gl_spirv spec, under issue #16 says:
+    *
+    * "ShaderBinary is expected to form an association between the SPIR-V
+    *  module and likely would not parse the module as would be required to
+    *  detect unsupported capabilities or other validation failures."
+    *
+    * Which specifies little to no validation requirements. Nevertheless, the
+    * two small checks below seem reasonable.
+    */
+   if (!binary || (length % 4) != 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glShaderBinary");
+      return;
+   }
+
    module = malloc(sizeof(*module) + length);
    if (!module) {
       _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderBinary");