sh: Disallow mismatched quotes in backticks (...).

Due to the amount of code removed by this, it seems that allowing unmatched
quotes was a deliberate imitation of System V sh and real ksh. Most other
shells do not allow unmatched quotes (e.g. bash, zsh, pdksh, NetBSD /bin/sh,
dash).

PR:		bin/137657
This commit is contained in:
Jilles Tjoelker 2009-10-01 21:40:08 +00:00
parent 165a00d1de
commit 47e5ae08a1
2 changed files with 8 additions and 7 deletions

View File

@ -82,7 +82,6 @@ struct heredoc {
STATIC struct heredoc *heredoclist; /* list of here documents to read */
STATIC int parsebackquote; /* nonzero if we are inside backquotes */
STATIC int doprompt; /* if set, prompt the user */
STATIC int needprompt; /* true if interactive and at start of line */
STATIC int lasttoken; /* last token read */
@ -1043,7 +1042,7 @@ readtoken1(int firstc, char const *syntax, char *eofmark, int striptabs)
endword:
if (syntax == ARISYNTAX)
synerror("Missing '))'");
if (syntax != BASESYNTAX && ! parsebackquote && eofmark == NULL)
if (syntax != BASESYNTAX && eofmark == NULL)
synerror("Unterminated quoted string");
if (varnest != 0) {
startlinno = plinno;
@ -1303,7 +1302,6 @@ parsesub: {
parsebackq: {
struct nodelist **nlpp;
int savepbq;
union node *n;
char *volatile str;
struct jmploc jmploc;
@ -1311,11 +1309,9 @@ parsebackq: {
int savelen;
int saveprompt;
savepbq = parsebackquote;
if (setjmp(jmploc.loc)) {
if (str)
ckfree(str);
parsebackquote = 0;
handler = savehandler;
longjmp(handler->loc, 1);
}
@ -1397,7 +1393,6 @@ parsebackq: {
nlpp = &(*nlpp)->next;
*nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist));
(*nlpp)->next = NULL;
parsebackquote = oldstyle;
if (oldstyle) {
saveprompt = doprompt;
@ -1433,7 +1428,6 @@ parsebackq: {
str = NULL;
INTON;
}
parsebackquote = savepbq;
handler = savehandler;
if (arinest || dblquote)
USTPUTC(CTLBACKQ | CTLQUOTE, out);

View File

@ -0,0 +1,7 @@
# $FreeBSD$
sh -c 'echo `echo .BA"DCODE.`
echo ".BAD"CODE.' 2>&1 | grep -q BADCODE && exit 1
echo '`"`' | sh -n 2>/dev/null && exit 1
echo '`'"'"'`' | sh -n 2>/dev/null && exit 1
exit 0