[macruby-changes] [2979] MacRuby/trunk/vm.cpp

source_changes at macosforge.org source_changes at macosforge.org
Sat Nov 7 11:37:49 PST 2009


Revision: 2979
          http://trac.macosforge.org/projects/ruby/changeset/2979
Author:   lsansonetti at apple.com
Date:     2009-11-07 11:37:46 -0800 (Sat, 07 Nov 2009)
Log Message:
-----------
make sure to sanitize method names because passing them to the added/removed/undefined callbacks

Modified Paths:
--------------
    MacRuby/trunk/vm.cpp

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2009-11-07 08:06:30 UTC (rev 2978)
+++ MacRuby/trunk/vm.cpp	2009-11-07 19:37:46 UTC (rev 2979)
@@ -767,19 +767,39 @@
     abort();
 }
 
+static ID
+sanitize_mid(SEL sel)
+{
+    const char *selname = sel_getName(sel);
+    const size_t sellen = strlen(selname);
+    if (selname[sellen - 1] == ':') {
+	if (memchr(selname, ':', sellen - 1) != NULL) {
+	    return 0;
+	}
+	char buf[100];
+	strncpy(buf, selname, sellen);
+	buf[sellen - 1] = '\0';
+	return rb_intern(buf);
+    }
+    return rb_intern(selname);
+}
+
 void
 RoxorCore::method_added(Class klass, SEL sel)
 {
     if (get_running()) {
 	// Call method_added: or singleton_method_added:.
-	VALUE sym = ID2SYM(rb_intern(sel_getName(sel)));
-        if (RCLASS_SINGLETON(klass)) {
-	    VALUE sk = rb_iv_get((VALUE)klass, "__attached__");
-	    rb_vm_call(sk, selSingletonMethodAdded, 1, &sym, false);
-        }
-        else {
-	    rb_vm_call((VALUE)klass, selMethodAdded, 1, &sym, false);
-        }
+	ID mid = sanitize_mid(sel);
+	if (mid != 0) {
+	    VALUE sym = ID2SYM(mid);
+	    if (RCLASS_SINGLETON(klass)) {
+		VALUE sk = rb_iv_get((VALUE)klass, "__attached__");
+		rb_vm_call(sk, selSingletonMethodAdded, 1, &sym, false);
+	    }
+	    else {
+		rb_vm_call((VALUE)klass, selMethodAdded, 1, &sym, false);
+	    }
+	}
     }
 
 }
@@ -2330,14 +2350,17 @@
     ruby_methods.erase(iter);
 #endif
 
-    VALUE sym = ID2SYM(rb_intern(sel_getName(sel)));
-    if (RCLASS_SINGLETON(klass)) {
-	VALUE sk = rb_iv_get((VALUE)klass, "__attached__");
-	rb_vm_call(sk, selSingletonMethodUndefined, 1, &sym, false);
+    ID mid = sanitize_mid(sel);
+    if (mid != 0) {
+	VALUE sym = ID2SYM(mid);
+	if (RCLASS_SINGLETON(klass)) {
+	    VALUE sk = rb_iv_get((VALUE)klass, "__attached__");
+	    rb_vm_call(sk, selSingletonMethodUndefined, 1, &sym, false);
+	}
+	else {
+	    rb_vm_call((VALUE)klass, selMethodUndefined, 1, &sym, false);
+	}
     }
-    else {
-	rb_vm_call((VALUE)klass, selMethodUndefined, 1, &sym, false);
-    }
 }
 
 extern "C"
@@ -2384,14 +2407,17 @@
     method_setImplementation(m, (IMP)rb_vm_removed_imp);
     invalidate_respond_to_cache();
 
-    VALUE sym = ID2SYM(rb_intern(sel_getName(sel)));
-    if (RCLASS_SINGLETON(klass)) {
-	VALUE sk = rb_iv_get((VALUE)klass, "__attached__");
-	rb_vm_call(sk, selSingletonMethodRemoved, 1, &sym, false);
+    ID mid = sanitize_mid(sel);
+    if (mid != 0) {
+	VALUE sym = ID2SYM(mid);
+	if (RCLASS_SINGLETON(klass)) {
+	    VALUE sk = rb_iv_get((VALUE)klass, "__attached__");
+	    rb_vm_call(sk, selSingletonMethodRemoved, 1, &sym, false);
+	}
+	else {
+	    rb_vm_call((VALUE)klass, selMethodRemoved, 1, &sym, false);
+	}
     }
-    else {
-	rb_vm_call((VALUE)klass, selMethodRemoved, 1, &sym, false);
-    }
 }
 
 extern "C"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091107/eb71d312/attachment.html>


More information about the macruby-changes mailing list