Skip to content

Commit fef3185

Browse files
committed
tool_urlglob: add integer overflow protection
It is most likely impossible to actually overflow, but this makes it certain. Closes curl#18398
1 parent 57d349f commit fef3185

1 file changed

Lines changed: 12 additions & 13 deletions

File tree

src/tool_urlglob.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -124,17 +124,21 @@ static CURLcode glob_set(struct URLGlob *glob, const char **patternp,
124124
/* add 1 to size since it will be incremented below */
125125
if(multiply(amount, pat->c.set.size + 1))
126126
return globerror(glob, "range overflow", 0, CURLE_URL_MALFORMAT);
127-
127+
done = TRUE;
128128
FALLTHROUGH();
129129
case ',':
130130
if(pat->c.set.elem) {
131-
char **new_arr = realloc(pat->c.set.elem,
132-
(size_t)(pat->c.set.size + 1) *
133-
sizeof(char *));
134-
if(!new_arr)
131+
char **arr;
132+
133+
if(pat->c.set.size >= (curl_off_t)(SIZE_T_MAX/(sizeof(char *))))
134+
return globerror(glob, "range overflow", 0, CURLE_URL_MALFORMAT);
135+
136+
arr = realloc(pat->c.set.elem, (size_t)(pat->c.set.size + 1) *
137+
sizeof(char *));
138+
if(!arr)
135139
return globerror(glob, NULL, 0, CURLE_OUT_OF_MEMORY);
136140

137-
pat->c.set.elem = new_arr;
141+
pat->c.set.elem = arr;
138142
}
139143
else
140144
pat->c.set.elem = malloc(sizeof(char *));
@@ -149,14 +153,9 @@ static CURLcode glob_set(struct URLGlob *glob, const char **patternp,
149153
++pat->c.set.size;
150154
curlx_dyn_reset(&glob->buf);
151155

152-
if(*pattern == '}') {
153-
pattern++; /* pass the closing brace */
154-
done = TRUE;
155-
continue;
156-
}
157-
158156
++pattern;
159-
++(*posp);
157+
if(!done)
158+
++(*posp);
160159
break;
161160

162161
case ']': /* illegal closing bracket */

0 commit comments

Comments
 (0)