summaryrefslogtreecommitdiff
path: root/Src/parse.c
diff options
context:
space:
mode:
authorPeter Stephenson <pws@zsh.org>2017-03-07 10:43:58 +0000
committerPeter Stephenson <pws@zsh.org>2017-03-07 10:43:58 +0000
commitf3f8537cfa05414ad14494e809d9ebfeef86ebbc (patch)
treecfb02314dd129609ef3d6fc85ce75fc63b8c9582 /Src/parse.c
parenta8345a40b1a79bb3a5c524ccf5fedf78040ae40e (diff)
downloadzsh-f3f8537cfa05414ad14494e809d9ebfeef86ebbc.tar.gz
zsh-f3f8537cfa05414ad14494e809d9ebfeef86ebbc.zip
40760: Always tokenize unquoted - to Dash.
This fixes use of pattern match character ranges in unusual contexts. Attempt to detect a tokenized - in cases where we don't care.
Diffstat (limited to 'Src/parse.c')
-rw-r--r--Src/parse.c41
1 files changed, 27 insertions, 14 deletions
diff --git a/Src/parse.c b/Src/parse.c
index 699ea49a2..6fe283dcb 100644
--- a/Src/parse.c
+++ b/Src/parse.c
@@ -2317,6 +2317,19 @@ par_cond_1(void)
}
/*
+ * Return 1 if condition matches. This also works for non-elided options.
+ *
+ * input is test string, may begin - or Dash.
+ * cond is condition following the -.
+ */
+static int check_cond(const char *input, const char *cond)
+{
+ if (!IS_DASH(input[0]))
+ return 0;
+ return !strcmp(input + 1, cond);
+}
+
+/*
* cond_2 : BANG cond_2
| INPAR { SEPER } cond_2 { SEPER } OUTPAR
| STRING STRING STRING
@@ -2342,7 +2355,7 @@ par_cond_2(void)
s1 = tokstr;
condlex();
/* ksh behavior: [ -t ] means [ -t 1 ]; bash disagrees */
- if (unset(POSIXBUILTINS) && !strcmp(s1, "-t"))
+ if (unset(POSIXBUILTINS) && check_cond(s1, "t"))
return par_cond_double(s1, dupstring("1"));
return par_cond_double(dupstring("-n"), s1);
}
@@ -2352,7 +2365,7 @@ par_cond_2(void)
if (!strcmp(*testargs, "=") ||
!strcmp(*testargs, "==") ||
!strcmp(*testargs, "!=") ||
- (**testargs == '-' && get_cond_num(*testargs + 1) >= 0)) {
+ (IS_DASH(**testargs) && get_cond_num(*testargs + 1) >= 0)) {
s1 = tokstr;
condlex();
s2 = tokstr;
@@ -2374,8 +2387,8 @@ par_cond_2(void)
* In "test" compatibility mode, "! -a ..." and "! -o ..."
* are treated as "[string] [and] ..." and "[string] [or] ...".
*/
- if (!(n_testargs > 1 &&
- (!strcmp(*testargs, "-a") || !strcmp(*testargs, "-o"))))
+ if (!(n_testargs > 1 && (check_cond(*testargs, "a") ||
+ check_cond(*testargs, "o"))))
{
condlex();
ecadd(WCB_COND(COND_NOT, 0));
@@ -2397,7 +2410,7 @@ par_cond_2(void)
return r;
}
s1 = tokstr;
- dble = (s1 && *s1 == '-'
+ dble = (s1 && IS_DASH(*s1)
&& (!n_testargs
|| strspn(s1+1, "abcdefghknoprstuvwxzLONGS") == 1)
&& !s1[2]);
@@ -2411,7 +2424,7 @@ par_cond_2(void)
YYERROR(ecused);
}
condlex();
- if (n_testargs == 2 && tok != STRING && tokstr && s1[0] == '-') {
+ if (n_testargs == 2 && tok != STRING && tokstr && IS_DASH(s1[0])) {
/*
* Something like "test -z" followed by a token.
* We'll turn the token into a string (we've also
@@ -2446,9 +2459,9 @@ par_cond_2(void)
} else
YYERROR(ecused);
}
- s2 = tokstr;
+ s2 = tokstr;
if (!n_testargs)
- dble = (s2 && *s2 == '-' && !s2[2]);
+ dble = (s2 && IS_DASH(*s2) && !s2[2]);
incond++; /* parentheses do globbing */
do condlex(); while (COND_SEP());
incond--; /* parentheses do grouping */
@@ -2476,7 +2489,7 @@ par_cond_2(void)
static int
par_cond_double(char *a, char *b)
{
- if (a[0] != '-' || !a[1])
+ if (!IS_DASH(a[0]) || !a[1])
COND_ERROR("parse error: condition expected: %s", a);
else if (!a[2] && strspn(a+1, "abcdefgknoprstuvwxzhLONGS") == 1) {
ecadd(WCB_COND(a[1], 0));
@@ -2534,7 +2547,7 @@ par_cond_triple(char *a, char *b, char *c)
ecadd(WCB_COND(COND_REGEX, 0));
ecstr(a);
ecstr(c);
- } else if (b[0] == '-') {
+ } else if (IS_DASH(b[0])) {
if ((t0 = get_cond_num(b + 1)) > -1) {
ecadd(WCB_COND(t0 + COND_NT, 0));
ecstr(a);
@@ -2545,7 +2558,7 @@ par_cond_triple(char *a, char *b, char *c)
ecstr(a);
ecstr(c);
}
- } else if (a[0] == '-' && a[1]) {
+ } else if (IS_DASH(a[0]) && a[1]) {
ecadd(WCB_COND(COND_MOD, 2));
ecstr(a);
ecstr(b);
@@ -2560,7 +2573,7 @@ par_cond_triple(char *a, char *b, char *c)
static int
par_cond_multi(char *a, LinkList l)
{
- if (a[0] != '-' || !a[1])
+ if (!IS_DASH(a[0]) || !a[1])
COND_ERROR("condition expected: %s", a);
else {
LinkNode n;
@@ -3256,10 +3269,10 @@ build_dump(char *nam, char *dump, char **files, int ali, int map, int flags)
for (hlen = FD_PRELEN, tlen = 0; *files; files++) {
struct stat st;
- if (!strcmp(*files, "-k")) {
+ if (check_cond(*files, "k")) {
flags = (flags & ~(FDHF_KSHLOAD | FDHF_ZSHLOAD)) | FDHF_KSHLOAD;
continue;
- } else if (!strcmp(*files, "-z")) {
+ } else if (check_cond(*files, "z")) {
flags = (flags & ~(FDHF_KSHLOAD | FDHF_ZSHLOAD)) | FDHF_ZSHLOAD;
continue;
}