Skip to content

Commit 2ef85d8

Browse files
Second revision
1 parent b7664c9 commit 2ef85d8

File tree

1 file changed

+34
-15
lines changed

1 file changed

+34
-15
lines changed

src/environ.c

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -103,29 +103,48 @@ static char *mag_escape_display_value(request_rec *req,
103103
/* This function returns a copy (in the pool) of the given gss_buffer_t
104104
* where every occurrence of " has been replaced by \". This string is
105105
* NULL terminated */
106-
int i = 0;
106+
int i = 0, j = 0;
107107
char *escaped_value = NULL, *p = NULL;
108108
char *value = (char*) disp_value.value;
109109

110110
/* gss_buffer_t are not \0 terminated, but our result will be. Hence,
111-
* escaped length will be original length * 2 + 1 in the worst case */
112-
p = escaped_value = apr_palloc(req->pool, disp_value.length * 2 + 1);
113-
for (i = 0; i < disp_value.length; i++) {
114-
switch (value[i]){
115-
case '"': memcpy(p, "\\\"", 2); p += 2; break;
116-
case '/': memcpy(p, "\\/", 2); p += 2; break;
117-
case '\\': memcpy(p, "\\\\", 2); p += 2; break;
118-
case '\b': memcpy(p, "\\b", 2); p += 2; break;
119-
case '\t': memcpy(p, "\\t", 2); p += 2; break;
120-
case '\r': memcpy(p, "\\r", 2); p += 2; break;
121-
case '\f': memcpy(p, "\\f", 2); p += 2; break;
122-
case '\n': memcpy(p, "\\n", 2); p += 2; break;
123-
default: *p = value[i]; p += 1; break;
111+
* escaped length will be original length * 6 + 1 in the worst case */
112+
p = escaped_value = apr_palloc(req->pool, disp_value.length * 6 + 1);
113+
for (i = 0, j = 0; i < disp_value.length; i++, j++) {
114+
if ((value[i] < 0x1F) || (value[i] == '"') || (value[i] == '\\')) {
115+
escaped_value[j] = '\\';
116+
j++;
117+
switch (value[i]) {
118+
case '"':
119+
case '\\':
120+
escaped_value[j] = value[i];
121+
break;
122+
case '\b':
123+
escaped_value[j] = 'b';
124+
break;
125+
case '\t':
126+
escaped_value[j] = 't';
127+
break;
128+
case '\r':
129+
escaped_value[j] = 'r';
130+
break;
131+
case '\f':
132+
escaped_value[j] = 'f';
133+
break;
134+
case '\n':
135+
escaped_value[j] = 'n';
136+
break;
137+
default:
138+
apr_snprintf(&escaped_value[j], 6, "u%04d", (int) value[i]);
139+
j += 4;
140+
}
141+
} else {
142+
escaped_value[j] = value[i];
124143
}
125144
}
126145

127146
/* Make the string NULL terminated */
128-
*p = 0;
147+
escaped_value[j] = '\0';
129148
return escaped_value;
130149
}
131150

0 commit comments

Comments
 (0)