f0df5e4
diff -ruN ruby-1.8.4.orig/re.c ruby-1.8.4/re.c
f0df5e4
--- ruby-1.8.4.orig/re.c	2005-12-13 12:27:51.000000000 +0900
f0df5e4
+++ ruby-1.8.4/re.c	2006-07-19 18:07:59.000000000 +0900
f0df5e4
@@ -70,10 +70,11 @@
f0df5e4
 #endif
f0df5e4
 
f0df5e4
 int
f0df5e4
-rb_memcicmp(p1, p2, len)
f0df5e4
-    char *p1, *p2;
f0df5e4
+rb_memcicmp(x, y, len)
f0df5e4
+    const void *x, *y;
f0df5e4
     long len;
f0df5e4
 {
f0df5e4
+    const unsigned char *p1 = x, *p2 = y;
f0df5e4
     int tmp;
f0df5e4
 
f0df5e4
     while (len--) {
f0df5e4
@@ -85,7 +86,7 @@
f0df5e4
 
f0df5e4
 int
f0df5e4
 rb_memcmp(p1, p2, len)
f0df5e4
-    char *p1, *p2;
f0df5e4
+    const void *p1, *p2;
f0df5e4
     long len;
f0df5e4
 {
f0df5e4
     if (!ruby_ignorecase) {
f0df5e4
@@ -96,11 +97,11 @@
f0df5e4
 
f0df5e4
 long
f0df5e4
 rb_memsearch(x0, m, y0, n)
f0df5e4
-    char *x0, *y0;
f0df5e4
+    const void *x0, *y0;
f0df5e4
     long m, n;
f0df5e4
 {
f0df5e4
-    unsigned char *x = (unsigned char *)x0, *y = (unsigned char *)y0;
f0df5e4
-    unsigned char *s, *e;
f0df5e4
+    const unsigned char *x = (unsigned char *)x0, *y = (unsigned char *)y0;
f0df5e4
+    const unsigned char *s, *e;
f0df5e4
     long i;
f0df5e4
     int d;
f0df5e4
     unsigned long hx, hy;
f0df5e4
@@ -1332,6 +1333,8 @@
f0df5e4
 {
f0df5e4
     struct RRegexp *re = RREGEXP(obj);
f0df5e4
 
f0df5e4
+    if (!OBJ_TAINTED(obj) && rb_safe_level() >= 4)
f0df5e4
+       rb_raise(rb_eSecurityError, "Insecure: can't modify regexp");
f0df5e4
     if (re->ptr) re_free_pattern(re->ptr);
f0df5e4
     if (re->str) free(re->str);
f0df5e4
     re->ptr = 0;
f0df5e4
diff -ruN ruby-1.8.4.orig/intern.h ruby-1.8.4/intern.h
f0df5e4
--- ruby-1.8.4.orig/intern.h	2006-07-19 18:13:49.000000000 +0900
f0df5e4
+++ ruby-1.8.4/intern.h	2006-07-19 18:20:34.000000000 +0900
f0df5e4
@@ -353,9 +353,9 @@
f0df5e4
 VALUE rb_range_beg_len _((VALUE, long*, long*, long, int));
f0df5e4
 VALUE rb_length_by_each _((VALUE));
f0df5e4
 /* re.c */
f0df5e4
-int rb_memcmp _((char*,char*,long));
f0df5e4
-int rb_memcicmp _((char*,char*,long));
f0df5e4
-long rb_memsearch _((char*,long,char*,long));
f0df5e4
+int rb_memcmp _((const void*,const void*,long));
f0df5e4
+int rb_memcicmp _((const void*,const void*,long));
f0df5e4
+long rb_memsearch _((const void*,long,const void*,long));
f0df5e4
 VALUE rb_reg_nth_defined _((int, VALUE));
f0df5e4
 VALUE rb_reg_nth_match _((int, VALUE));
f0df5e4
 VALUE rb_reg_last_match _((VALUE));