diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-05 22:19:28 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2017-07-05 22:19:28 +0200 |
| commit | 4142f0187dcf8454e8d2a8d16b321dbd573c170e (patch) | |
| tree | 88fca8c1cc9b6b213160d386c66ede7026bf7c08 /shell | |
| parent | ed79a636238ec15c562862787dd71cd9de168b7d (diff) | |
| download | busybox-w32-4142f0187dcf8454e8d2a8d16b321dbd573c170e.tar.gz busybox-w32-4142f0187dcf8454e8d2a8d16b321dbd573c170e.tar.bz2 busybox-w32-4142f0187dcf8454e8d2a8d16b321dbd573c170e.zip | |
ash: fix escaping of a few characters (broken by last commits)
Add a testcase which tests all ASCII punctuation escapes.
NB: hush is failing this test!
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
| -rw-r--r-- | shell/ash.c | 9 | ||||
| -rw-r--r-- | shell/ash_test/ash-quoting/quoted_punct.right | 35 | ||||
| -rwxr-xr-x | shell/ash_test/ash-quoting/quoted_punct.tests | 41 |
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 @@ | |||
| 1 | ok | ||
| 2 | ok | ||
| 3 | ok | ||
| 4 | ok | ||
| 5 | ok | ||
| 6 | ok | ||
| 7 | ok | ||
| 8 | ok | ||
| 9 | ok | ||
| 10 | ok | ||
| 11 | ok | ||
| 12 | ok | ||
| 13 | ok | ||
| 14 | ok | ||
| 15 | ok | ||
| 16 | ok | ||
| 17 | ok | ||
| 18 | ok | ||
| 19 | ok | ||
| 20 | ok | ||
| 21 | ok | ||
| 22 | ok | ||
| 23 | ok | ||
| 24 | ok | ||
| 25 | ok | ||
| 26 | ok | ||
| 27 | ok | ||
| 28 | ok | ||
| 29 | ok | ||
| 30 | ok | ||
| 31 | ok | ||
| 32 | ok | ||
| 33 | ok | ||
| 34 | ok | ||
| 35 | ok | ||
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 | ||
| 4 | case '!' in [\!] ) echo ok;; *) echo 'WRONG!';; esac | ||
| 5 | case '"' in [\"] ) echo ok;; *) echo 'WRONG"';; esac | ||
| 6 | case '#' in [\#] ) echo ok;; *) echo 'WRONG#';; esac | ||
| 7 | case '$' in [\$] ) echo ok;; *) echo 'WRONG$';; esac | ||
| 8 | case '%' in [\%] ) echo ok;; *) echo 'WRONG%';; esac | ||
| 9 | case '&' in [\&] ) echo ok;; *) echo 'WRONG&';; esac | ||
| 10 | case "'" in [\'] ) echo ok;; *) echo "WRONG'";; esac | ||
| 11 | case '(' in [\(] ) echo ok;; *) echo 'WRONG(';; esac | ||
| 12 | case ')' in [\)] ) echo ok;; *) echo 'WRONG)';; esac | ||
| 13 | case '*' in [\*] ) echo ok;; *) echo 'WRONG*';; esac | ||
| 14 | case '+' in [\+] ) echo ok;; *) echo 'WRONG+';; esac | ||
| 15 | case ',' in [\,] ) echo ok;; *) echo 'WRONG,';; esac | ||
| 16 | case '-' in [\-] ) echo ok;; *) echo 'WRONG-';; esac | ||
| 17 | case '-' in [a\-c]) echo ok;; *) echo 'WRONGa\-c';; esac | ||
| 18 | case '.' in [\.] ) echo ok;; *) echo 'WRONG.';; esac | ||
| 19 | case '/' in [\/] ) echo ok;; *) echo 'WRONG/';; esac | ||
| 20 | # 3a..40 | ||
| 21 | case ':' in [\:] ) echo ok;; *) echo 'WRONG:';; esac | ||
| 22 | case ';' in [\;] ) echo ok;; *) echo 'WRONG;';; esac | ||
| 23 | case '<' in [\<] ) echo ok;; *) echo 'WRONG<';; esac | ||
| 24 | case '=' in [\=] ) echo ok;; *) echo 'WRONG=';; esac | ||
| 25 | case '>' in [\>] ) echo ok;; *) echo 'WRONG>';; esac | ||
| 26 | case '?' in [\?] ) echo ok;; *) echo 'WRONG?';; esac | ||
| 27 | case '@' in [\@] ) echo ok;; *) echo 'WRONG@';; esac | ||
| 28 | # 5b..60 | ||
| 29 | case '[' in [\[] ) echo ok;; *) echo 'WRONG[';; esac | ||
| 30 | case '\' in [\\] ) echo ok;; *) echo 'WRONG\';; esac | ||
| 31 | case '\' in \\ ) echo ok;; *) echo 'WRONG\\';; esac | ||
| 32 | case ']' in [\]] ) echo ok;; *) echo 'WRONG]';; esac | ||
| 33 | case ']' in [a\]]) echo ok;; *) echo 'WRONGa]';; esac | ||
| 34 | case '^' in [\^] ) echo ok;; *) echo 'WRONG^';; esac | ||
| 35 | case '_' in [\_] ) echo ok;; *) echo 'WRONG_';; esac | ||
| 36 | case '`' in [\`] ) echo ok;; *) echo 'WRONG`';; esac | ||
| 37 | # 7b..7e | ||
| 38 | case '{' in [\{] ) echo ok;; *) echo 'WRONG{';; esac | ||
| 39 | case '|' in [\|] ) echo ok;; *) echo 'WRONG|';; esac | ||
| 40 | case '}' in [\}] ) echo ok;; *) echo 'WRONG}';; esac | ||
| 41 | case '~' in [\~] ) echo ok;; *) echo 'WRONG~';; esac | ||
