bug: segfault when using super and method_missing

B

Brad Hilton

Hello,

The following code produces a segfault with ruby-1.8.4 from gentoo,
as well as with ruby-1.8 from cvs and 1.9 from cvs. There appears to
be an issue when super is called in the subclass and the parent class
has method_missing defined. Strangely, if super is called with
explicit arguments, no segfault occurs. Likewise, if the method
definition in the subclass is modified slightly (see below) the
segfault is avoided.

Thanks,
Brad

------------------------------------
class BaseClass
def method_missing(*args)
p args
end
end

class Article < BaseClass

# if this is defined as title=(arg) the segfault does not occur
def title=(*args)
super(args) # works
super(*args) # works
super # segfault...
end
end

a = Article.new
a.body = 'body'
a.title = 'foo'
-------------------------------
 
G

Guillaume Benny

Hi,

This works for me. I've tried both:

ruby 1.8.2 (2004-12-25) [i386-mswin32] (Windows)
ruby 1.8.4 (2005-12-24) [i386-linux] (gentoo linux)

Just a guess, but maybe you compiled ruby with to much optimizations in
CFLAGS ? Mine are

CFLAGS="-O2 -fomit-frame-pointer"

Hope this helps...

Guillaume
 
Y

Yukihiro Matsumoto

Hi,

In message "Re: bug: segfault when using super and method_missing"

|The following code produces a segfault with ruby-1.8.4 from gentoo,
|as well as with ruby-1.8 from cvs and 1.9 from cvs. There appears to
|be an issue when super is called in the subclass and the parent class
|has method_missing defined. Strangely, if super is called with
|explicit arguments, no segfault occurs. Likewise, if the method
|definition in the subclass is modified slightly (see below) the
|segfault is avoided.

A bug was in super without any argument. The patch attached should
fix the bug. Thank you for reporting it.

matz.

--- eval.c 3 Mar 2006 17:39:26 -0000 1.616.2.165
+++ eval.c 23 Mar 2006 01:48:22 -0000
@@ -5578,7 +5578,18 @@ method_missing(obj, id, argc, argv, call
}
+ if (argc < 0) {
+ VALUE tmp;

- nargv = ALLOCA_N(VALUE, argc+1);
- nargv[0] = ID2SYM(id);
- MEMCPY(nargv+1, argv, VALUE, argc);
+ argc = -argc-1;
+ tmp = splat_value(argv[argc]);
+ nargv = ALLOCA_N(VALUE, argc + RARRAY(tmp)->len + 1);
+ MEMCPY(nargv+1, argv, VALUE, argc);
+ MEMCPY(nargv+1+argc, RARRAY(tmp)->ptr, VALUE, RARRAY(tmp)->len);
+ argc += RARRAY(tmp)->len;

+ }
+ else {
+ nargv = ALLOCA_N(VALUE, argc+1);
+ MEMCPY(nargv+1, argv, VALUE, argc);
+ }
+ nargv[0] = ID2SYM(id);
return rb_funcall2(obj, missing, argc+1, nargv);
 
J

Joel VanderWerf

Brad said:
Hello,

The following code produces a segfault with ruby-1.8.4 from gentoo, as

It's ok on

ruby 1.8.4 (2005-12-24) [i686-linux]

built from source with the default options (on ubuntu).
 
Y

Yukihiro Matsumoto

Hi,

In message "Re: bug: segfault when using super and method_missing"

|It's ok on
|
|ruby 1.8.4 (2005-12-24) [i686-linux]
|
|built from source with the default options (on ubuntu).

It happens only on CVS top.

matz.
 
B

Brad Hilton

A bug was in super without any argument. The patch attached should
fix the bug. Thank you for reporting it.

Thanks for your help and the quick patch!

-Brad
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top