diff options
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | dir.c | 18 |
2 files changed, 13 insertions, 9 deletions
@@ -1,3 +1,7 @@ +Wed Mar 17 14:44:43 Hirokazu Yamamoto <ocean@m2.ccsnet.ne.jp> + + * dir.c (range): fix possible "\0" overrun. (in case of "\0-") + Mon Mar 15 07:39:13 2004 Yukihiro Matsumoto <matz@ruby-lang.org> * eval.c (rb_yield_0): should not re-submit TAG_BREAK if this @@ -107,25 +107,25 @@ range(pat, test, flags) test = downcase(test); - while (*pat) { + while (*pat != ']') { int cstart, cend; + if (escape && *pat == '\\') + pat++; cstart = cend = *pat++; - if (cstart == ']') - return ok == not ? 0 : pat; - else if (escape && cstart == '\\') - cstart = cend = *pat++; + if (!cstart) + return 0; if (*pat == '-' && pat[1] != ']') { - if (escape && pat[1] == '\\') + pat++; + if (escape && *pat == '\\') pat++; - cend = pat[1]; + cend = *pat++; if (!cend) return 0; - pat += 2; } if (downcase(cstart) <= test && test <= downcase(cend)) ok = 1; } - return 0; + return ok == not ? 0 : pat + 1; } #define ISDIRSEP(c) (pathname && isdirsep(c)) |