Forum: Ruby bug: segfault when using super and method_missing

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
C956127788363de57933fe09b857da33?d=identicon&s=25 Brad Hilton (Guest)
on 2006-03-23 02:09
(Received via mailing list)
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'
87c8c00547d60456371a0cf4c342ad0e?d=identicon&s=25 Guillaume Benny (Guest)
on 2006-03-23 02:29
(Received via mailing list)
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
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2006-03-23 02:49
(Received via mailing list)
Hi,

In message "Re: bug: segfault when using super and method_missing"
    on Thu, 23 Mar 2006 10:09:37 +0900, Brad Hilton <bhilton@vpop.net>
writes:

|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);
47b1910084592eb77a032bc7d8d1a84e?d=identicon&s=25 Joel VanderWerf (Guest)
on 2006-03-23 02:50
(Received via mailing list)
Brad Hilton wrote:
> 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).
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2006-03-23 02:55
(Received via mailing list)
Hi,

In message "Re: bug: segfault when using super and method_missing"
    on Thu, 23 Mar 2006 10:50:01 +0900, Joel VanderWerf
<vjoel@path.berkeley.edu> writes:

|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.
C956127788363de57933fe09b857da33?d=identicon&s=25 Brad Hilton (Guest)
on 2006-03-23 03:01
(Received via mailing list)
On Mar 22, 2006, at 5:49 PM, Yukihiro Matsumoto wrote:
>
> 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
This topic is locked and can not be replied to.