mesa: glsl: disallow user-defined functions/vars prefixed with gl_
authorBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 02:28:14 +0000 (20:28 -0600)
committerBrian Paul <brian.paul@tungstengraphics.com>
Wed, 6 Aug 2008 02:57:17 +0000 (20:57 -0600)
src/mesa/shader/slang/slang_compile.c

index 5ce0e2e..f90bbd8 100644 (file)
 
 
 /**
+ * Check if the given identifier is legal.
+ */
+static GLboolean
+legal_identifier(slang_atom name)
+{
+   /* "gl_" is a reserved prefix */
+   if (_mesa_strncmp((char *) name, "gl_", 3) == 0) {
+      return GL_FALSE;
+   }
+   return GL_TRUE;
+}
+
+
+/**
  * Allocate storage for a variable of 'size' bytes from given pool.
  * Return the allocated address for the variable.
  */
@@ -835,6 +849,12 @@ parse_statement(slang_parse_ctx * C, slang_output_ctx * O,
                o->type = SLANG_OPER_VARIABLE_DECL;
                o->locals->outer_scope = O->vars;
                o->a_id = O->vars->variables[i]->a_name;
+
+               if (!legal_identifier(o->a_id)) {
+                  slang_info_log_error(C->L, "illegal variable name '%s'",
+                                       (char *) o->a_id);
+                  return 0;
+               }
             }
          }
       }
@@ -1404,6 +1424,7 @@ parse_operator_name(slang_parse_ctx * C)
    return 0;
 }
 
+
 static int
 parse_function_prototype(slang_parse_ctx * C, slang_output_ctx * O,
                          slang_function * func)
@@ -1441,6 +1462,12 @@ parse_function_prototype(slang_parse_ctx * C, slang_output_ctx * O,
       return 0;
    }
 
+   if (!legal_identifier(func->header.a_name)) {
+      slang_info_log_error(C->L, "illegal function name '%s'",
+                           (char *) func->header.a_name);
+      return 0;
+   }
+
    /* parse function parameters */
    while (*C->I++ == PARAMETER_NEXT) {
       slang_variable *p = slang_variable_scope_grow(func->parameters);