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) static int patmatch(char *pattern, const char *string) { - return pmatch(preglob(pattern, 0), string); + char *p = preglob(pattern, 0); + //bb_error_msg("fnmatch(pattern:'%s',str:'%s')", p, string); + return pmatch(p, string); } /* 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) return (char*)list; } -/* Used for "eval" builtin */ +/* Used for "eval" builtin and case string */ static char* expand_strvec_to_string(char **argv) { char **list; @@ -8053,6 +8053,7 @@ static int run_list(struct pipe *pi) if (rword == RES_CASE) { debug_printf_exec("CASE cond_code:%d\n", cond_code); case_word = expand_strvec_to_string(pi->cmds->argv); + unbackslash(case_word); continue; } if (rword == RES_MATCH) { @@ -8064,9 +8065,10 @@ static int run_list(struct pipe *pi) /* all prev words didn't match, does this one match? */ argv = pi->cmds->argv; while (*argv) { - char *pattern = expand_string_to_string(*argv, /*unbackslash:*/ 1); + char *pattern = expand_string_to_string(*argv, /*unbackslash:*/ 0); /* TODO: which FNM_xxx flags to use? */ cond_code = (fnmatch(pattern, case_word, /*flags:*/ 0) != 0); + debug_printf_exec("fnmatch(pattern:'%s',str:'%s'):%d\n", pattern, case_word, cond_code); free(pattern); if (cond_code == 0) { /* match! we will execute this branch */ 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 @@ +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok +ok 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 @@ +# Testing glob-escaping of every ASCII punctuation char +# Some chars have more than one test +# 21..2f +case '!' in [\!] ) echo ok;; *) echo 'WRONG!';; esac +case '"' in [\"] ) echo ok;; *) echo 'WRONG"';; esac +case '#' in [\#] ) echo ok;; *) echo 'WRONG#';; esac +case '$' in [\$] ) echo ok;; *) echo 'WRONG$';; esac +case '%' in [\%] ) echo ok;; *) echo 'WRONG%';; esac +case '&' in [\&] ) echo ok;; *) echo 'WRONG&';; esac +case "'" in [\'] ) echo ok;; *) echo "WRONG'";; esac +case '(' in [\(] ) echo ok;; *) echo 'WRONG(';; esac +case ')' in [\)] ) echo ok;; *) echo 'WRONG)';; esac +case '*' in [\*] ) echo ok;; *) echo 'WRONG*';; esac +case '+' in [\+] ) echo ok;; *) echo 'WRONG+';; esac +case ',' in [\,] ) echo ok;; *) echo 'WRONG,';; esac +case '-' in [\-] ) echo ok;; *) echo 'WRONG-';; esac +case '-' in [a\-c]) echo ok;; *) echo 'WRONGa\-c';; esac +case '.' in [\.] ) echo ok;; *) echo 'WRONG.';; esac +case '/' in [\/] ) echo ok;; *) echo 'WRONG/';; esac +# 3a..40 +case ':' in [\:] ) echo ok;; *) echo 'WRONG:';; esac +case ';' in [\;] ) echo ok;; *) echo 'WRONG;';; esac +case '<' in [\<] ) echo ok;; *) echo 'WRONG<';; esac +case '=' in [\=] ) echo ok;; *) echo 'WRONG=';; esac +case '>' in [\>] ) echo ok;; *) echo 'WRONG>';; esac +case '?' in [\?] ) echo ok;; *) echo 'WRONG?';; esac +case '@' in [\@] ) echo ok;; *) echo 'WRONG@';; esac +# 5b..60 +case '[' in [\[] ) echo ok;; *) echo 'WRONG[';; esac +case '\' in [\\] ) echo ok;; *) echo 'WRONG\';; esac +case '\' in \\ ) echo ok;; *) echo 'WRONG\\';; esac +case ']' in [\]] ) echo ok;; *) echo 'WRONG]';; esac +case ']' in [a\]]) echo ok;; *) echo 'WRONGa]';; esac +case '^' in [\^] ) echo ok;; *) echo 'WRONG^';; esac +case '_' in [\_] ) echo ok;; *) echo 'WRONG_';; esac +case '`' in [\`] ) echo ok;; *) echo 'WRONG`';; esac +# 7b..7e +case '{' in [\{] ) echo ok;; *) echo 'WRONG{';; esac +case '|' in [\|] ) echo ok;; *) echo 'WRONG|';; esac +case '}' in [\}] ) echo ok;; *) echo 'WRONG}';; esac +case '~' in [\~] ) echo ok;; *) echo 'WRONG~';; esac