aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2017-07-05 23:12:15 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2017-07-05 23:12:15 +0200
commitbd43c6784fb53826806c7cb51a1ed54e95eb4be9 (patch)
tree8b250b2eaa4781af90a4c4b6702903b11cdf7f24
parent4142f0187dcf8454e8d2a8d16b321dbd573c170e (diff)
downloadbusybox-w32-bd43c6784fb53826806c7cb51a1ed54e95eb4be9.tar.gz
busybox-w32-bd43c6784fb53826806c7cb51a1ed54e95eb4be9.tar.bz2
busybox-w32-bd43c6784fb53826806c7cb51a1ed54e95eb4be9.zip
hush: fix quoted_punct.tests failure
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r--shell/ash.c4
-rw-r--r--shell/hush.c6
-rw-r--r--shell/hush_test/hush-quoting/quoted_punct.right35
-rwxr-xr-xshell/hush_test/hush-quoting/quoted_punct.tests41
4 files changed, 83 insertions, 3 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 946e8726e..b7635a823 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -7613,7 +7613,9 @@ expandhere(union node *arg, int fd)
7613static int 7613static int
7614patmatch(char *pattern, const char *string) 7614patmatch(char *pattern, const char *string)
7615{ 7615{
7616 return pmatch(preglob(pattern, 0), string); 7616 char *p = preglob(pattern, 0);
7617 //bb_error_msg("fnmatch(pattern:'%s',str:'%s')", p, string);
7618 return pmatch(p, string);
7617} 7619}
7618 7620
7619/* 7621/*
diff --git a/shell/hush.c b/shell/hush.c
index 30add72f0..7574e3918 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -5969,7 +5969,7 @@ static char *expand_string_to_string(const char *str, int do_unbackslash)
5969 return (char*)list; 5969 return (char*)list;
5970} 5970}
5971 5971
5972/* Used for "eval" builtin */ 5972/* Used for "eval" builtin and case string */
5973static char* expand_strvec_to_string(char **argv) 5973static char* expand_strvec_to_string(char **argv)
5974{ 5974{
5975 char **list; 5975 char **list;
@@ -8053,6 +8053,7 @@ static int run_list(struct pipe *pi)
8053 if (rword == RES_CASE) { 8053 if (rword == RES_CASE) {
8054 debug_printf_exec("CASE cond_code:%d\n", cond_code); 8054 debug_printf_exec("CASE cond_code:%d\n", cond_code);
8055 case_word = expand_strvec_to_string(pi->cmds->argv); 8055 case_word = expand_strvec_to_string(pi->cmds->argv);
8056 unbackslash(case_word);
8056 continue; 8057 continue;
8057 } 8058 }
8058 if (rword == RES_MATCH) { 8059 if (rword == RES_MATCH) {
@@ -8064,9 +8065,10 @@ static int run_list(struct pipe *pi)
8064 /* all prev words didn't match, does this one match? */ 8065 /* all prev words didn't match, does this one match? */
8065 argv = pi->cmds->argv; 8066 argv = pi->cmds->argv;
8066 while (*argv) { 8067 while (*argv) {
8067 char *pattern = expand_string_to_string(*argv, /*unbackslash:*/ 1); 8068 char *pattern = expand_string_to_string(*argv, /*unbackslash:*/ 0);
8068 /* TODO: which FNM_xxx flags to use? */ 8069 /* TODO: which FNM_xxx flags to use? */
8069 cond_code = (fnmatch(pattern, case_word, /*flags:*/ 0) != 0); 8070 cond_code = (fnmatch(pattern, case_word, /*flags:*/ 0) != 0);
8071 debug_printf_exec("fnmatch(pattern:'%s',str:'%s'):%d\n", pattern, case_word, cond_code);
8070 free(pattern); 8072 free(pattern);
8071 if (cond_code == 0) { /* match! we will execute this branch */ 8073 if (cond_code == 0) { /* match! we will execute this branch */
8072 free(case_word); 8074 free(case_word);
diff --git a/shell/hush_test/hush-quoting/quoted_punct.right b/shell/hush_test/hush-quoting/quoted_punct.right
new file mode 100644
index 000000000..ab66c3ce0
--- /dev/null
+++ b/shell/hush_test/hush-quoting/quoted_punct.right
@@ -0,0 +1,35 @@
1ok
2ok
3ok
4ok
5ok
6ok
7ok
8ok
9ok
10ok
11ok
12ok
13ok
14ok
15ok
16ok
17ok
18ok
19ok
20ok
21ok
22ok
23ok
24ok
25ok
26ok
27ok
28ok
29ok
30ok
31ok
32ok
33ok
34ok
35ok
diff --git a/shell/hush_test/hush-quoting/quoted_punct.tests b/shell/hush_test/hush-quoting/quoted_punct.tests
new file mode 100755
index 000000000..83ee40bf4
--- /dev/null
+++ b/shell/hush_test/hush-quoting/quoted_punct.tests
@@ -0,0 +1,41 @@
1# Testing glob-escaping of every ASCII punctuation char
2# Some chars have more than one test
3# 21..2f
4case '!' in [\!] ) echo ok;; *) echo 'WRONG!';; esac
5case '"' in [\"] ) echo ok;; *) echo 'WRONG"';; esac
6case '#' in [\#] ) echo ok;; *) echo 'WRONG#';; esac
7case '$' in [\$] ) echo ok;; *) echo 'WRONG$';; esac
8case '%' in [\%] ) echo ok;; *) echo 'WRONG%';; esac
9case '&' in [\&] ) echo ok;; *) echo 'WRONG&';; esac
10case "'" in [\'] ) echo ok;; *) echo "WRONG'";; esac
11case '(' in [\(] ) echo ok;; *) echo 'WRONG(';; esac
12case ')' in [\)] ) echo ok;; *) echo 'WRONG)';; esac
13case '*' in [\*] ) echo ok;; *) echo 'WRONG*';; esac
14case '+' in [\+] ) echo ok;; *) echo 'WRONG+';; esac
15case ',' in [\,] ) echo ok;; *) echo 'WRONG,';; esac
16case '-' in [\-] ) echo ok;; *) echo 'WRONG-';; esac
17case '-' in [a\-c]) echo ok;; *) echo 'WRONGa\-c';; esac
18case '.' in [\.] ) echo ok;; *) echo 'WRONG.';; esac
19case '/' in [\/] ) echo ok;; *) echo 'WRONG/';; esac
20# 3a..40
21case ':' in [\:] ) echo ok;; *) echo 'WRONG:';; esac
22case ';' in [\;] ) echo ok;; *) echo 'WRONG;';; esac
23case '<' in [\<] ) echo ok;; *) echo 'WRONG<';; esac
24case '=' in [\=] ) echo ok;; *) echo 'WRONG=';; esac
25case '>' in [\>] ) echo ok;; *) echo 'WRONG>';; esac
26case '?' in [\?] ) echo ok;; *) echo 'WRONG?';; esac
27case '@' in [\@] ) echo ok;; *) echo 'WRONG@';; esac
28# 5b..60
29case '[' in [\[] ) echo ok;; *) echo 'WRONG[';; esac
30case '\' in [\\] ) echo ok;; *) echo 'WRONG\';; esac
31case '\' in \\ ) echo ok;; *) echo 'WRONG\\';; esac
32case ']' in [\]] ) echo ok;; *) echo 'WRONG]';; esac
33case ']' in [a\]]) echo ok;; *) echo 'WRONGa]';; esac
34case '^' in [\^] ) echo ok;; *) echo 'WRONG^';; esac
35case '_' in [\_] ) echo ok;; *) echo 'WRONG_';; esac
36case '`' in [\`] ) echo ok;; *) echo 'WRONG`';; esac
37# 7b..7e
38case '{' in [\{] ) echo ok;; *) echo 'WRONG{';; esac
39case '|' in [\|] ) echo ok;; *) echo 'WRONG|';; esac
40case '}' in [\}] ) echo ok;; *) echo 'WRONG}';; esac
41case '~' in [\~] ) echo ok;; *) echo 'WRONG~';; esac