aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/ash.c9
-rw-r--r--shell/ash_test/ash-quoting/quoted_punct.right35
-rwxr-xr-xshell/ash_test/ash-quoting/quoted_punct.tests41
3 files changed, 83 insertions, 2 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 9b1f57949..946e8726e 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -5939,12 +5939,17 @@ rmescapes(char *str, int flag)
5939 * (for example, glibc <= 2.22). 5939 * (for example, glibc <= 2.22).
5940 * 5940 *
5941 * Lets add "\" only on the chars which need it. 5941 * Lets add "\" only on the chars which need it.
5942 * Testcases for less obvious chars are shown.
5942 */ 5943 */
5943 if (*p == '*' 5944 if (*p == '*'
5944 || *p == '?' 5945 || *p == '?'
5945 || *p == '[' 5946 || *p == '['
5946 /* || *p == ']' maybe also this? */ 5947 || *p == '\\' /* case '\' in \\ ) echo ok;; *) echo WRONG;; esac */
5947 || *p == '\\' 5948 || *p == ']' /* case ']' in [a\]] ) echo ok;; *) echo WRONG;; esac */
5949 || *p == '-' /* case '-' in [a\-c]) echo ok;; *) echo WRONG;; esac */
5950 || *p == '!' /* case '!' in [\!] ) echo ok;; *) echo WRONG;; esac */
5951 /* Some libc support [^negate], that's why "^" also needs love */
5952 || *p == '^' /* case '^' in [\^] ) echo ok;; *) echo WRONG;; esac */
5948 ) { 5953 ) {
5949 *q++ = '\\'; 5954 *q++ = '\\';
5950 } 5955 }
diff --git a/shell/ash_test/ash-quoting/quoted_punct.right b/shell/ash_test/ash-quoting/quoted_punct.right
new file mode 100644
index 000000000..ab66c3ce0
--- /dev/null
+++ b/shell/ash_test/ash-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/ash_test/ash-quoting/quoted_punct.tests b/shell/ash_test/ash-quoting/quoted_punct.tests
new file mode 100755
index 000000000..83ee40bf4
--- /dev/null
+++ b/shell/ash_test/ash-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