diff options
-rw-r--r-- | shell/ash.c | 23 |
1 files changed, 11 insertions, 12 deletions
diff --git a/shell/ash.c b/shell/ash.c index d830e3962..d320c38ac 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -6606,22 +6606,19 @@ subevalvar(char *p, char *varname, int strloc, int subtype, | |||
6606 | * ash -c 'echo ${#1#}' name:'1=#' | 6606 | * ash -c 'echo ${#1#}' name:'1=#' |
6607 | */ | 6607 | */ |
6608 | static NOINLINE ssize_t | 6608 | static NOINLINE ssize_t |
6609 | varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int *nulonly) | 6609 | varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int *quotedp) |
6610 | { | 6610 | { |
6611 | const char *p; | 6611 | const char *p; |
6612 | int num; | 6612 | int num; |
6613 | int i; | 6613 | int i; |
6614 | ssize_t len = 0; | 6614 | ssize_t len = 0; |
6615 | int sep; | 6615 | int sep; |
6616 | int quoted = flags & EXP_QUOTED; | 6616 | int quoted = *quotedp; |
6617 | int subtype = varflags & VSTYPE; | 6617 | int subtype = varflags & VSTYPE; |
6618 | int discard = subtype == VSPLUS || subtype == VSLENGTH; | 6618 | int discard = subtype == VSPLUS || subtype == VSLENGTH; |
6619 | int quotes = (discard ? 0 : (flags & QUOTES_ESC)) | QUOTES_KEEPNUL; | 6619 | int quotes = (discard ? 0 : (flags & QUOTES_ESC)) | QUOTES_KEEPNUL; |
6620 | int syntax = quoted ? DQSYNTAX : BASESYNTAX; | 6620 | int syntax = quoted ? DQSYNTAX : BASESYNTAX; |
6621 | 6621 | ||
6622 | sep = *nulonly ? (flags & EXP_FULL) << CHAR_BIT : 0; | ||
6623 | *nulonly = 0; | ||
6624 | |||
6625 | switch (*name) { | 6622 | switch (*name) { |
6626 | case '$': | 6623 | case '$': |
6627 | num = rootpid; | 6624 | num = rootpid; |
@@ -6658,6 +6655,7 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int | |||
6658 | char **ap; | 6655 | char **ap; |
6659 | char sepc; | 6656 | char sepc; |
6660 | 6657 | ||
6658 | sep = 0; | ||
6661 | if (quoted && (flags & EXP_FULL)) { | 6659 | if (quoted && (flags & EXP_FULL)) { |
6662 | /* note: this is not meant as PEOF value */ | 6660 | /* note: this is not meant as PEOF value */ |
6663 | sep = 1 << CHAR_BIT; | 6661 | sep = 1 << CHAR_BIT; |
@@ -6665,11 +6663,14 @@ varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int | |||
6665 | } | 6663 | } |
6666 | /* fall through */ | 6664 | /* fall through */ |
6667 | case '*': | 6665 | case '*': |
6668 | sep |= ifsset() ? (unsigned char)(ifsval()[0]) : ' '; | 6666 | sep = ifsset() ? (unsigned char)(ifsval()[0]) : ' '; |
6667 | if (!quoted) { | ||
6669 | param: | 6668 | param: |
6670 | ap = shellparam.p; | 6669 | sep |= (flags & EXP_FULL) << CHAR_BIT; |
6670 | } | ||
6671 | sepc = sep; | 6671 | sepc = sep; |
6672 | *nulonly = !sepc; | 6672 | *quotedp = !sepc; |
6673 | ap = shellparam.p; | ||
6673 | if (!ap) | 6674 | if (!ap) |
6674 | return -1; | 6675 | return -1; |
6675 | while ((p = *ap++) != NULL) { | 6676 | while ((p = *ap++) != NULL) { |
@@ -6759,7 +6760,6 @@ evalvar(char *p, int flag, struct strlist *var_str_list) | |||
6759 | char subtype; | 6760 | char subtype; |
6760 | int quoted; | 6761 | int quoted; |
6761 | char easy; | 6762 | char easy; |
6762 | int nulonly; | ||
6763 | char *var; | 6763 | char *var; |
6764 | int patloc; | 6764 | int patloc; |
6765 | int startloc; | 6765 | int startloc; |
@@ -6770,12 +6770,11 @@ evalvar(char *p, int flag, struct strlist *var_str_list) | |||
6770 | quoted = flag & EXP_QUOTED; | 6770 | quoted = flag & EXP_QUOTED; |
6771 | var = p; | 6771 | var = p; |
6772 | easy = (!quoted || (*var == '@' && shellparam.nparam)); | 6772 | easy = (!quoted || (*var == '@' && shellparam.nparam)); |
6773 | nulonly = easy; | ||
6774 | startloc = expdest - (char *)stackblock(); | 6773 | startloc = expdest - (char *)stackblock(); |
6775 | p = strchr(p, '=') + 1; //TODO: use var_end(p)? | 6774 | p = strchr(p, '=') + 1; //TODO: use var_end(p)? |
6776 | 6775 | ||
6777 | again: | 6776 | again: |
6778 | varlen = varvalue(var, varflags, flag, var_str_list, &nulonly); | 6777 | varlen = varvalue(var, varflags, flag, var_str_list, "ed); |
6779 | if (varflags & VSNUL) | 6778 | if (varflags & VSNUL) |
6780 | varlen--; | 6779 | varlen--; |
6781 | 6780 | ||
@@ -6824,7 +6823,7 @@ evalvar(char *p, int flag, struct strlist *var_str_list) | |||
6824 | record: | 6823 | record: |
6825 | if (!easy) | 6824 | if (!easy) |
6826 | goto end; | 6825 | goto end; |
6827 | recordregion(startloc, expdest - (char *)stackblock(), nulonly); | 6826 | recordregion(startloc, expdest - (char *)stackblock(), quoted); |
6828 | goto end; | 6827 | goto end; |
6829 | } | 6828 | } |
6830 | 6829 | ||