diff options
author | Daniel Stenberg <daniel@haxx.se> | 2016-10-04 17:25:09 +0200 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2016-10-31 08:46:35 +0100 |
commit | ee4f76606cfa4ee068bf28edd37c8dae7e8db317 (patch) | |
tree | 59ebe6924c27dc9909f1c769781e1738c0f12f72 /src | |
parent | 269a88910436d730ac212f4dc01cbe6961338061 (diff) |
range: reject char globs with missing end like '[L-]'
... which previously would lead to out of boundary reads.
Reported-by: Luật Nguyễn
Diffstat (limited to 'src')
-rw-r--r-- | src/tool_urlglob.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/src/tool_urlglob.c b/src/tool_urlglob.c index c45a78b21..09d21b61e 100644 --- a/src/tool_urlglob.c +++ b/src/tool_urlglob.c @@ -188,32 +188,36 @@ static CURLcode glob_range(URLGlob *glob, char **patternp, /* character range detected */ char min_c; char max_c; + char end_c; int step=1; pat->type = UPTCharRange; - rc = sscanf(pattern, "%c-%c", &min_c, &max_c); + rc = sscanf(pattern, "%c-%c%c", &min_c, &max_c, &end_c); - if((rc == 2) && (pattern[3] == ':')) { - char *endp; - unsigned long lstep; - errno = 0; - lstep = strtoul(&pattern[4], &endp, 10); - if(errno || (*endp != ']')) - step = -1; - else { - pattern = endp+1; - step = (int)lstep; - if(step > (max_c - min_c)) + if(rc == 3) { + if(end_c == ':') { + char *endp; + unsigned long lstep; + errno = 0; + lstep = strtoul(&pattern[4], &endp, 10); + if(errno || (*endp != ']')) step = -1; + else { + pattern = endp+1; + step = (int)lstep; + if(step > (max_c - min_c)) + step = -1; + } } + else if(end_c != ']') + /* then this is wrong */ + rc = 0; } - else - pattern += 4; *posp += (pattern - *patternp); - if((rc != 2) || (min_c >= max_c) || ((max_c - min_c) > ('z' - 'a')) || + if((rc != 3) || (min_c >= max_c) || ((max_c - min_c) > ('z' - 'a')) || (step <= 0) ) /* the pattern is not well-formed */ return GLOBERROR("bad range", *posp, CURLE_URL_MALFORMAT); |