Skip to content

Commit

Permalink
Prevent shader crash if invalid builtin used after array member accessor
Browse files Browse the repository at this point in the history
(cherry picked from commit 3a70566)
  • Loading branch information
Chaosus authored and akien-mga committed Feb 14, 2020
1 parent 388adac commit 3b2490f
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 12 deletions.
34 changes: 27 additions & 7 deletions servers/visual/shader_language.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2986,14 +2986,32 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons
bool is_const = false;
int array_size = 0;

if (!_find_identifier(p_block, p_builtin_types, identifier, &data_type, &ident_type, &is_const, &array_size)) {
_set_error("Unknown identifier in expression: " + String(identifier));
return NULL;
}
if (p_block && p_block->block_tag != SubClassTag::TAG_GLOBAL) {
int idx = 0;
bool found = false;

if (ident_type == IDENTIFIER_FUNCTION) {
_set_error("Can't use function as identifier: " + String(identifier));
return NULL;
while (builtin_func_defs[idx].name) {
if (builtin_func_defs[idx].tag == p_block->block_tag && builtin_func_defs[idx].name == identifier) {
found = true;
break;
}
idx++;
}
if (!found) {
_set_error("Unknown identifier in expression: " + String(identifier));
return NULL;
}
} else {

if (!_find_identifier(p_block, p_builtin_types, identifier, &data_type, &ident_type, &is_const, &array_size)) {
_set_error("Unknown identifier in expression: " + String(identifier));
return NULL;
}

if (ident_type == IDENTIFIER_FUNCTION) {
_set_error("Can't use function as identifier: " + String(identifier));
return NULL;
}
}

Node *index_expression = NULL;
Expand All @@ -3009,7 +3027,9 @@ ShaderLanguage::Node *ShaderLanguage::_parse_expression(BlockNode *p_block, cons

if (tk.type == TK_PERIOD) {
completion_class = TAG_ARRAY;
p_block->block_tag = SubClassTag::TAG_ARRAY;
call_expression = _parse_and_reduce_expression(p_block, p_builtin_types);
p_block->block_tag = SubClassTag::TAG_GLOBAL;
if (!call_expression)
return NULL;
data_type = call_expression->get_datatype();
Expand Down
12 changes: 7 additions & 5 deletions servers/visual/shader_language.h
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,11 @@ class ShaderLanguage {
ARGUMENT_QUALIFIER_INOUT,
};

enum SubClassTag {
TAG_GLOBAL,
TAG_ARRAY,
};

struct Node {
Node *next;

Expand Down Expand Up @@ -431,6 +436,7 @@ class ShaderLanguage {
};

int block_type;
SubClassTag block_tag;

struct Variable {
DataType type;
Expand All @@ -449,6 +455,7 @@ class ShaderLanguage {
parent_function(NULL),
parent_block(NULL),
block_type(BLOCK_TYPE_STANDART),
block_tag(SubClassTag::TAG_GLOBAL),
single_statement(false) {}
};

Expand Down Expand Up @@ -713,11 +720,6 @@ class ShaderLanguage {
bool _validate_assign(Node *p_node, const Map<StringName, BuiltInInfo> &p_builtin_types, String *r_message = NULL);
bool _validate_operator(OperatorNode *p_op, DataType *r_ret_type = NULL);

enum SubClassTag {
TAG_GLOBAL,
TAG_ARRAY,
};

struct BuiltinFuncDef {
enum { MAX_ARGS = 5 };
const char *name;
Expand Down

0 comments on commit 3b2490f

Please sign in to comment.