From: noreply@... Date: 2006-02-01T15:37:58+09:00 Subject: [ ruby-Bugs-3399 ] [PATCH] OS X core dumps when $0 is changed and then loads shared libraries Bugs item #3399, was opened at 2006-01-31 22:25 You can respond by visiting: http://rubyforge.org/tracker/?func=detail&atid=1698&aid=3399&group_id=426 Category: Core Group: None Status: Open Resolution: None Priority: 3 Submitted By: Blair Zajac (blairzajac) Assigned to: Nobody (None) Summary: [PATCH] OS X core dumps when $0 is changed and then loads shared libraries Initial Comment: This is a patch to fix the following issue that occurs on OS X. If you run $ irb -r rubygems -r XXX where XXX may be Imagemagick, Postgres, etc then you may get a core dump. It appears to only happen with non Ruby-core packages. I've reproduced the core dump with the following combinations of platforms: Fink's Ruby 1.8.3, postgres 0.7.1 (against Postgresql 8.1.1) Fink's Ruby 1.8.4, postgres 0.7.1 (against Postgresql 8.1.2) Fink's Ruby 1.8.4, ruby-postgres 0.7.1.2005.12.21 (against Postgresql 8.1.2) Darwin Ports 1.8.4, postgres 0.7.1 (against Postgresql 8.1.2) This is all described in http://www.ruby-talk.org/cgi-bin/scat.rb/ruby/ruby-talk/142806 The problem is that Ruby is setting argv[1..argc-1] to 0 and OS X's dyld expects those to not be 0 as it uses them. Postgres had the same problem and describes why dyld uses argv: http://archives.postgresql.org/pgsql-hackers/2003-11/msg00449.php The fix is not to set argv[1..argc-1] to NULL in set_arg0. This code was was added in http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/ruby/ruby.c.diff?r1=1.51;r2=1.52;f=h It's not clear to me why in one branch of the function at the end, origargv[1..argc-1] are set to 0 and in the other they are not. Just out of consistently, it seems better to have both treat origargv[1..argc-1] the same and not set them to 0, which also prevents this core dump. Here's the patch: diff -ru ruby-1.8.4.orig/ruby.c ruby-1.8.4/ruby.c --- ruby-1.8.4.orig/ruby.c 2005-12-11 16:36:52.000000000 -0800 +++ ruby-1.8.4/ruby.c 2006-01-31 22:13:18.000000000 -0800 @@ -1067,8 +1067,6 @@ *s++ = '\0'; while (++i < len) *s++ = ' '; - for (i = 1; i < origargc; i++) - origargv[i] = 0; } rb_progname = rb_tainted_str_new2(origargv[0]); #endif Regards, Blair ---------------------------------------------------------------------- You can respond by visiting: http://rubyforge.org/tracker/?func=detail&atid=1698&aid=3399&group_id=426