diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-08-04 22:25:28 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-08-04 22:25:28 +0200 |
commit | c2aa218f23a4e952746ebef7bb86668c6255471c (patch) | |
tree | 6a2884b85c52a31ad9b69e7bd2cde5d688fa139e /shell/ash.c | |
parent | 2005d3ff3661220f11e8ff1911b24051b3669566 (diff) | |
download | busybox-w32-c2aa218f23a4e952746ebef7bb86668c6255471c.tar.gz busybox-w32-c2aa218f23a4e952746ebef7bb86668c6255471c.tar.bz2 busybox-w32-c2aa218f23a4e952746ebef7bb86668c6255471c.zip |
ash,hush: properly handle ${v//pattern/repl} if pattern starts with /
Closes 2695
function old new delta
parse_dollar 762 790 +28
subevalvar 1258 1267 +9
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 37/0) Total: 37 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c index 03fbbee53..5c431c9ff 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -6854,8 +6854,15 @@ subevalvar(char *p, char *varname, int strloc, int subtype, | |||
6854 | if (subtype == VSREPLACE || subtype == VSREPLACEALL) { | 6854 | if (subtype == VSREPLACE || subtype == VSREPLACEALL) { |
6855 | /* Find '/' and replace with NUL */ | 6855 | /* Find '/' and replace with NUL */ |
6856 | repl = p; | 6856 | repl = p; |
6857 | /* The pattern can't be empty. | ||
6858 | * IOW: if the first char after "${v//" is a slash, | ||
6859 | * it does not terminate the pattern - it's the first char of the pattern: | ||
6860 | * v=/dev/ram; echo ${v////-} prints -dev-ram (pattern is "/") | ||
6861 | * v=/dev/ram; echo ${v///r/-} prints /dev-am (pattern is "/r") | ||
6862 | */ | ||
6863 | if (*repl == '/') | ||
6864 | repl++; | ||
6857 | for (;;) { | 6865 | for (;;) { |
6858 | /* Handle escaped slashes, e.g. "${v/\//_}" (they are CTLESC'ed by this point) */ | ||
6859 | if (*repl == '\0') { | 6866 | if (*repl == '\0') { |
6860 | repl = NULL; | 6867 | repl = NULL; |
6861 | break; | 6868 | break; |
@@ -6864,6 +6871,7 @@ subevalvar(char *p, char *varname, int strloc, int subtype, | |||
6864 | *repl = '\0'; | 6871 | *repl = '\0'; |
6865 | break; | 6872 | break; |
6866 | } | 6873 | } |
6874 | /* Handle escaped slashes, e.g. "${v/\//_}" (they are CTLESC'ed by this point) */ | ||
6867 | if ((unsigned char)*repl == CTLESC && repl[1]) | 6875 | if ((unsigned char)*repl == CTLESC && repl[1]) |
6868 | repl++; | 6876 | repl++; |
6869 | repl++; | 6877 | repl++; |