aboutsummaryrefslogtreecommitdiffhomepage
path: root/parse_util.cpp
diff options
context:
space:
mode:
authorGravatar ridiculousfish <corydoras@ridiculousfish.com>2014-03-26 18:20:38 -0700
committerGravatar ridiculousfish <corydoras@ridiculousfish.com>2014-03-26 18:20:38 -0700
commit0325c1ba659a2ecd18c5765437b37077cf40ad5c (patch)
treeaca8ce04dda1ee17fcf84a63894f36ebcbe1cb22 /parse_util.cpp
parentf2a437bd3bff39fc40e9fc0868cb22d47cc84614 (diff)
Teach parse_util_detect_errors to report invalid builtins, as found in
issue #1252
Diffstat (limited to 'parse_util.cpp')
-rw-r--r--parse_util.cpp13
1 files changed, 12 insertions, 1 deletions
diff --git a/parse_util.cpp b/parse_util.cpp
index d1f7a482..0d626161 100644
--- a/parse_util.cpp
+++ b/parse_util.cpp
@@ -40,6 +40,7 @@
#include "wildcard.h"
#include "parse_tree.h"
#include "parser.h"
+#include "builtin.h"
/**
Error message for improper use of the exec builtin
@@ -1288,8 +1289,11 @@ parser_test_error_bits_t parse_util_detect_errors(const wcstring &buff_src, pars
// In a few places below, we want to know if we are in a pipeline
const bool is_in_pipeline = node_tree.statement_is_in_pipeline(node, true /* count first */);
+ // We need to know the decoration
+ const enum parse_statement_decoration_t decoration = node_tree.decoration_for_plain_statement(node);
+
// Check that we don't try to pipe through exec
- if (is_in_pipeline && node_tree.decoration_for_plain_statement(node) == parse_statement_decoration_exec)
+ if (is_in_pipeline && decoration == parse_statement_decoration_exec)
{
errored = append_syntax_error(&parse_errors, node, EXEC_ERR_MSG, L"exec");
}
@@ -1380,6 +1384,13 @@ parser_test_error_bits_t parse_util_detect_errors(const wcstring &buff_src, pars
errored = append_syntax_error(&parse_errors, node, (command == L"break" ? INVALID_BREAK_ERR_MSG : INVALID_CONTINUE_ERR_MSG));
}
}
+
+ // Check that we don't do an invalid builtin (#1252)
+ if (! errored && decoration == parse_statement_decoration_builtin && ! builtin_exists(command))
+ {
+ errored = append_syntax_error(&parse_errors, node, UNKNOWN_BUILTIN_ERR_MSG, command.c_str());
+ }
+
}
}
}