sh: Do not allow overriding a special builtin with a function.
This is a syntax error. POSIX does not say explicitly whether defining a function with the same name as a special builtin is allowed, but it does say that it is impossible to call such a function. A special builtin can still be overridden with an alias. This commit is part of a set of changes that will ensure that when something looks like a special builtin to the parser, it is one. (Not the other way around, as it remains possible to call a special builtin named by a variable or other substitution.) Exp-run done by: pav (with some other sh(1) changes)
This commit is contained in:
parent
0ef7c8a20b
commit
67e109adbe
@ -57,6 +57,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include "alias.h"
|
||||
#include "show.h"
|
||||
#include "eval.h"
|
||||
#include "exec.h" /* to check for special builtins */
|
||||
#ifndef NO_HISTORY
|
||||
#include "myhistedit.h"
|
||||
#endif
|
||||
@ -606,6 +607,7 @@ simplecmd(union node **rpp, union node *redir)
|
||||
union node *args, **app;
|
||||
union node **orig_rpp = rpp;
|
||||
union node *n = NULL;
|
||||
int special;
|
||||
|
||||
/* If we don't have any redirections already, then we must reset */
|
||||
/* rpp to be the address of the local redir variable. */
|
||||
@ -647,6 +649,9 @@ simplecmd(union node **rpp, union node *redir)
|
||||
strchr(n->narg.text, '/'))
|
||||
synerror("Bad function name");
|
||||
rmescapes(n->narg.text);
|
||||
if (find_builtin(n->narg.text, &special) >= 0 &&
|
||||
special)
|
||||
synerror("Cannot override a special builtin with a function");
|
||||
n->type = NDEFUN;
|
||||
n->narg.next = command();
|
||||
funclinno = 0;
|
||||
|
7
tools/regression/bin/sh/execution/func3.0
Normal file
7
tools/regression/bin/sh/execution/func3.0
Normal file
@ -0,0 +1,7 @@
|
||||
# $FreeBSD$
|
||||
|
||||
# This may fail when parsing or when defining the function, or the definition
|
||||
# may silently do nothing. In no event may the function be executed.
|
||||
|
||||
sh -c 'unset() { echo overriding function executed, bad; }; v=1; unset v; exit "${v-0}"' 2>/dev/null
|
||||
:
|
Loading…
Reference in New Issue
Block a user