aboutsummaryrefslogtreecommitdiffhomepage
path: root/parse_tree.cpp
diff options
context:
space:
mode:
authorGravatar Konrad Borowski <glitchmr@myopera.com>2013-10-14 11:45:29 +0200
committerGravatar Konrad Borowski <glitchmr@myopera.com>2013-10-14 11:45:29 +0200
commit22d22f6aa883a6f48e9df0cd55254faa2cfc425e (patch)
tree79eba97a5a652399713d9cb1b42708af8dafb42a /parse_tree.cpp
parente8ba3c2f4de8c60808e9c919cc3e947d15136e21 (diff)
Remove undefined behavior from parse_error().
Having function that takes arbitrary number of arguments without actually reading them is undefined behavior, as it could cause stack to be in the corrupted state. Now arguments after token are parsed, even if they aren't needed. See also: http://asciinema.org/a/5904
Diffstat (limited to 'parse_tree.cpp')
-rw-r--r--parse_tree.cpp27
1 files changed, 17 insertions, 10 deletions
diff --git a/parse_tree.cpp b/parse_tree.cpp
index 97421dab..3e0c5256 100644
--- a/parse_tree.cpp
+++ b/parse_tree.cpp
@@ -341,6 +341,7 @@ class parse_ll_t
bool top_node_handle_terminal_types(parse_token_t token);
void parse_error(const wchar_t *expected, parse_token_t token);
+ void parse_error(parse_token_t token);
void parse_error(parse_token_t token, const wchar_t *format, ...);
void append_error_callout(wcstring &error_message, parse_token_t token);
@@ -551,19 +552,25 @@ void parse_ll_t::acquire_output(parse_node_tree_t *output, parse_error_list_t *e
this->symbol_stack.clear();
}
-void parse_ll_t::parse_error(parse_token_t token, const wchar_t *fmt, ...)
+void parse_ll_t::parse_error(parse_token_t token)
{
this->fatal_errored = true;
- if (this->should_generate_error_messages)
- {
- //this->dump_stack();
- parse_error_t err;
+}
+
+void parse_ll_t::parse_error(parse_token_t token, const wchar_t *fmt, ...)
+{
+ parse_error(token);
+
+ //this->dump_stack();
+ parse_error_t err;
- va_list va;
- va_start(va, fmt);
- err.text = vformat_string(fmt, va);
- va_end(va);
+ va_list va;
+ va_start(va, fmt);
+ err.text = vformat_string(fmt, va);
+ va_end(va);
+ if (this->should_generate_error_messages)
+ {
err.source_start = token.source_start;
err.source_length = token.source_length;
this->errors.push_back(err);
@@ -730,7 +737,7 @@ void parse_ll_t::accept_tokens(parse_token_t token1, parse_token_t token2)
}
else
{
- this->parse_error(token1, NULL);
+ this->parse_error(token1);
}
// parse_error sets fatal_errored, which ends the loop
}