[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