diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-09-01 15:44:39 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2003-09-01 15:44:39 +0000 |
commit | 157c60a09ff02cd89397fc480bb86dd539dd456e (patch) | |
tree | 9dbcbc5a9500f7f8514418e5be9074d87663a9d9 | |
parent | 26fcfd1bb5c39506f3be79b0bb9be2efce8febab (diff) |
* re.c (rb_memsearch): fix overrun. [ruby-talk:80759]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4477 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 4 | ||||
-rw-r--r-- | re.c | 23 |
2 files changed, 17 insertions, 10 deletions
@@ -1,3 +1,7 @@ +Tue Sep 2 00:44:37 2003 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * re.c (rb_memsearch): fix overrun. [ruby-talk:80759] + Tue Sep 2 00:41:27 2003 Nobuyoshi Nakada <nobu@ruby-lang.org> * ext/iconv/iconv.c (map_charset): use lower case keys. @@ -107,7 +107,8 @@ rb_memsearch(x0, m, y0, n) #define KR_REHASH(a, b, h) (((h) << 1) - ((a)<<d) + (b)) - s = y; e = s + n - m + 1; + if (m > n) return -1; + s = y; e = s + n - m; /* Preprocessing */ /* computes d = 2^(m-1) with @@ -116,36 +117,38 @@ rb_memsearch(x0, m, y0, n) if (d > m) d = m; if (ruby_ignorecase) { + if (n == m) { + return rb_memcicmp(x, s, m) == 0 ? 0 : -1; + } /* Prepare hash value */ for (hy = hx = i = 0; i < d; ++i) { hx = KR_REHASH(0, casetable[x[i]], hx); hy = KR_REHASH(0, casetable[s[i]], hy); } /* Searching */ - while (s < e) { - if (hx == hy && rb_memcicmp(x, s, m) == 0) { - return s-y; - } + while (hx != hy || rb_memcicmp(x, s, m)) { + if (s >= e) return -1; hy = KR_REHASH(casetable[*s], casetable[*(s+d)], hy); s++; } } else { + if (n == m) { + return memcmp(x, s, m) == 0 ? 0 : -1; + } /* Prepare hash value */ for (hy = hx = i = 0; i < d; ++i) { hx = KR_REHASH(0, x[i], hx); hy = KR_REHASH(0, s[i], hy); } /* Searching */ - while (s < e) { - if (hx == hy && memcmp(x, s, m) == 0) { - return s-y; - } + while (hx != hy || memcmp(x, s, m)) { + if (s >= e) return -1; hy = KR_REHASH(*s, *(s+d), hy); s++; } } - return -1; + return s-y; } #define REG_CASESTATE FL_USER0 |