glthread: always sync for glShaderSource because invalid params can crash
authorMarek Olšák <marek.olsak@amd.com>
Tue, 23 Aug 2022 19:41:52 +0000 (15:41 -0400)
committerMarge Bot <emma+marge@anholt.net>
Wed, 21 Sep 2022 14:54:49 +0000 (14:54 +0000)
If an invalid parameter is received along with an invalid pointer and we
ignore the invalid parameter and dereference the pointer, we crash.
Since we can't fully validate all parameters (such as whether "shader"
is a valid object ID), remove the custom code.

Acked-by: Adam Jackson <ajax@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18223>

src/mapi/glapi/gen/gl_API.xml
src/mesa/main/glthread_shaderobj.c

index ce73745..1d21f3a 100644 (file)
         <glx ignore="true"/>
     </function>
 
-    <function name="ShaderSource" es2="2.0" marshal="custom" no_error="true">
+    <function name="ShaderSource" es2="2.0" no_error="true">
         <param name="shader" type="GLuint"/>
         <param name="count" type="GLsizei"/>
         <param name="string" type="const GLchar * const *"/>
index 617f10f..773e7c3 100644 (file)
 #include "uniforms.h"
 #include "api_exec_decl.h"
 
-struct marshal_cmd_ShaderSource
-{
-   struct marshal_cmd_base cmd_base;
-   GLuint shader;
-   GLsizei count;
-   /* Followed by GLint length[count], then the contents of all strings,
-    * concatenated.
-    */
-};
-
-
-uint32_t
-_mesa_unmarshal_ShaderSource(struct gl_context *ctx,
-                             const struct marshal_cmd_ShaderSource *cmd,
-                             const uint64_t *last)
-{
-   const GLint *cmd_length = (const GLint *) (cmd + 1);
-   const GLchar *cmd_strings = (const GLchar *) (cmd_length + cmd->count);
-   /* TODO: how to deal with malloc failure? */
-   const GLchar * *string = malloc(cmd->count * sizeof(const GLchar *));
-   int i;
-
-   for (i = 0; i < cmd->count; ++i) {
-      string[i] = cmd_strings;
-      cmd_strings += cmd_length[i];
-   }
-   CALL_ShaderSource(ctx->CurrentServerDispatch,
-                     (cmd->shader, cmd->count, string, cmd_length));
-   free((void *)string);
-   return cmd->cmd_base.cmd_size;
-}
-
-
-static size_t
-measure_ShaderSource_strings(GLsizei count, const GLchar * const *string,
-                             const GLint *length_in, GLint *length_out)
-{
-   int i;
-   size_t total_string_length = 0;
-
-   for (i = 0; i < count; ++i) {
-      if (length_in == NULL || length_in[i] < 0) {
-         if (string[i])
-            length_out[i] = strlen(string[i]);
-      } else {
-         length_out[i] = length_in[i];
-      }
-      total_string_length += length_out[i];
-   }
-   return total_string_length;
-}
-
-
-void GLAPIENTRY
-_mesa_marshal_ShaderSource(GLuint shader, GLsizei count,
-                           const GLchar * const *string, const GLint *length)
-{
-   /* TODO: how to report an error if count < 0? */
-
-   GET_CURRENT_CONTEXT(ctx);
-   /* TODO: how to deal with malloc failure? */
-   const size_t fixed_cmd_size = sizeof(struct marshal_cmd_ShaderSource);
-   STATIC_ASSERT(sizeof(struct marshal_cmd_ShaderSource) % sizeof(GLint) == 0);
-   size_t length_size = count * sizeof(GLint);
-   GLint *length_tmp = malloc(length_size);
-   size_t total_string_length =
-      measure_ShaderSource_strings(count, string, length, length_tmp);
-   size_t total_cmd_size = fixed_cmd_size + length_size + total_string_length;
-
-   if (total_cmd_size <= MARSHAL_MAX_CMD_SIZE && count > 0) {
-      struct marshal_cmd_ShaderSource *cmd =
-         _mesa_glthread_allocate_command(ctx, DISPATCH_CMD_ShaderSource,
-                                         total_cmd_size);
-      GLint *cmd_length = (GLint *) (cmd + 1);
-      GLchar *cmd_strings = (GLchar *) (cmd_length + count);
-      int i;
-
-      cmd->shader = shader;
-      cmd->count = count;
-      memcpy(cmd_length, length_tmp, length_size);
-      for (i = 0; i < count; ++i) {
-         memcpy(cmd_strings, string[i], cmd_length[i]);
-         cmd_strings += cmd_length[i];
-      }
-   } else {
-      _mesa_glthread_finish(ctx);
-      CALL_ShaderSource(ctx->CurrentServerDispatch,
-                        (shader, count, string, length_tmp));
-   }
-   free(length_tmp);
-}
-
 void
 _mesa_glthread_ProgramChanged(struct gl_context *ctx)
 {