aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--shell/ash.c23
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 */
6608static NOINLINE ssize_t 6608static NOINLINE ssize_t
6609varvalue(char *name, int varflags, int flags, struct strlist *var_str_list, int *nulonly) 6609varvalue(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, &quoted);
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