summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-09-01 15:44:39 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2003-09-01 15:44:39 +0000
commit157c60a09ff02cd89397fc480bb86dd539dd456e (patch)
tree9dbcbc5a9500f7f8514418e5be9074d87663a9d9
parent26fcfd1bb5c39506f3be79b0bb9be2efce8febab (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--ChangeLog4
-rw-r--r--re.c23
2 files changed, 17 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 54fdee5c57..1d950551df 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/re.c b/re.c
index 53c6832c2a..7460d6ae3d 100644
--- a/re.c
+++ b/re.c
@@ -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