View | Details | Raw Unified | Return to bug 204602
Collapse All | Expand All

(-)/code/illumos-gate/usr/src/boot/sys/boot/common/interp_parse.c (-6 / +25 lines)
Lines 72-80 Link Here
72
static int
72
static int
73
isquote(int ch)
73
isquote(int ch)
74
{
74
{
75
    return (ch == '\'' || ch == '"');
75
    return (ch == '\'');
76
}
76
}
77
77
78
static int
79
isdquote(int ch)
80
{
81
    return (ch == '"');
82
}
83
78
int
84
int
79
parse(int *argc, char ***argv, char *str)
85
parse(int *argc, char ***argv, char *str)
80
{
86
{
Lines 81-91 Link Here
81
    int ac;
87
    int ac;
82
    char *val, *p, *q, *copy = NULL;
88
    char *val, *p, *q, *copy = NULL;
83
    size_t i = 0;
89
    size_t i = 0;
84
    char token, tmp, quote, *buf;
90
    char token, tmp, quote, dquote, *buf;
85
    enum { STR, VAR, WHITE } state;
91
    enum { STR, VAR, WHITE } state;
86
92
87
    ac = *argc = 0;
93
    ac = *argc = 0;
88
    quote = 0;
94
    dquote = quote = 0;
89
    if (!str || (p = copy = backslash(str)) == NULL)
95
    if (!str || (p = copy = backslash(str)) == NULL)
90
	return 1;
96
	return 1;
91
97
Lines 105-113 Link Here
105
		buf[i++] = *p++;
111
		buf[i++] = *p++;
106
	    } else if (isquote(*p)) {
112
	    } else if (isquote(*p)) {
107
		quote = quote ? 0 : *p;
113
		quote = quote ? 0 : *p;
108
		++p;
114
		if (dquote) { /* keep quote */
115
			PARSE_FAIL(i == (PARSE_BUFSIZE - 1));
116
			buf[i++] = *p++;
117
		} else
118
			++p;
119
	    } else if (isdquote(*p)) {
120
		dquote = dquote ? 0 : *p;
121
		if (quote) { /* keep dquote */
122
			PARSE_FAIL(i == (PARSE_BUFSIZE - 1));
123
			buf[i++] = *p++;
124
		} else
125
			++p;
109
	    }
126
	    }
110
	    else if (isspace(*p) && !quote) {
127
	    else if (isspace(*p) && !quote && !dquote) {
111
		state = WHITE;
128
		state = WHITE;
112
		if (i) {
129
		if (i) {
113
		    buf[i] = '\0';
130
		    buf[i] = '\0';
Lines 115-121 Link Here
115
		    i = 0;
132
		    i = 0;
116
		}
133
		}
117
		++p;
134
		++p;
118
	    } else if (*p == '$') {
135
	    } else if (*p == '$' && !quote) {
119
		token = isdelim(*(p + 1));
136
		token = isdelim(*(p + 1));
120
		if (token)
137
		if (token)
121
		    p += 2;
138
		    p += 2;
Lines 157-162 Link Here
157
	    break;
174
	    break;
158
	}
175
	}
159
    }
176
    }
177
    /* missing terminating ' or " */
178
    PARSE_FAIL(quote || dquote);
160
    /* If at end of token, add it */
179
    /* If at end of token, add it */
161
    if (i && state == STR) {
180
    if (i && state == STR) {
162
	buf[i] = '\0';
181
	buf[i] = '\0';

Return to bug 204602