[#7286] Re: ruby-dev summary 28206-28273 — ara.t.howard@...

On Thu, 2 Feb 2006, Minero Aoki wrote:

23 messages 2006/02/02
[#7292] ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — mathew <meta@...> 2006/02/02

[#7293] Re: ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — mathew <meta@...> 2006/02/02

mathew wrote:

[#7298] Re: ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — James Britt <ruby@...> 2006/02/03

mathew wrote:

[#7310] Re: ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — Evan Webb <evanwebb@...> 2006/02/07

I'm not sure we even need the 'with' syntax. Even if we do, it breaks

[#7311] Re: ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — Eero Saynatkari <ruby-ml@...> 2006/02/07

On 2006.02.07 10:03, Evan Webb wrote:

[#7313] Re: ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — Evan Webb <evanwebb@...> 2006/02/07

Umm, on what version are you seeing a warning there? I don't and never

[#7315] Re: ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — Eero Saynatkari <ruby-ml@...> 2006/02/07

On 2006.02.07 14:47, Evan Webb wrote:

[#7316] Re: ANDCALL / iff? / &? (was Re: ruby-dev summary 28206-28273) — Evan Webb <evanwebb@...> 2006/02/07

I'd by far prefer it never emit a warning. The warning is assumes you

[#7305] Re: Problem with weak references on OS X 10.3 — Mauricio Fernandez <mfp@...>

On Sun, Feb 05, 2006 at 08:33:40PM +0900, Christian Neukirchen wrote:

28 messages 2006/02/05
[#7401] Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — Eric Hodel <drbrain@...7.net> 2006/02/22

On Feb 5, 2006, at 5:05 AM, Mauricio Fernandez wrote:

[#7414] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — Mauricio Fernandez <mfp@...> 2006/02/23

On Wed, Feb 22, 2006 at 02:21:24PM +0900, Eric Hodel wrote:

[#7428] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — Tanaka Akira <akr@...17n.org> 2006/02/26

In article <1140968746.321377.18843.nullmailer@x31.priv.netlab.jp>,

[#7444] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — nobu@... 2006/02/28

Hi,

[#7445] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — Tanaka Akira <akr@...17n.org> 2006/02/28

In article <m1FDshr-0006MNC@Knoppix>,

[#7447] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — Tanaka Akira <akr@...17n.org> 2006/02/28

In article <87irr047sx.fsf@m17n.org>,

[#7448] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — Tanaka Akira <akr@...17n.org> 2006/02/28

In article <87vev0hxu5.fsf@m17n.org>,

[#7465] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — "Evan Webb" <evanwebb@...> 2006/03/01

Just my quick 2 cents...

[#7468] Re: Symbols overlap ordinary objects, especially on OS X (Was: Re: Problem with weak references on OS X 10.3) — Tanaka Akira <akr@...17n.org> 2006/03/01

In article <92f5f81d0602281855g27e78f4eua8bf20e0b8e47b68@mail.gmail.com>,

[#7403] Module#define_method "send hack" fails with Ruby 1.9 — Emiel van de Laar <emiel@...>

Hi List,

12 messages 2006/02/22
[#7404] Re: Module#define_method "send hack" fails with Ruby 1.9 — George Ogata <g_ogata@...> 2006/02/22

Emiel van de Laar <emiel@rednode.nl> writes:

[#7406] Re: Module#define_method "send hack" fails with Ruby 1.9 — dblack@... 2006/02/22

Hi --

[#7442] GC Question — zdennis <zdennis@...>

I have been posting to the ruby-talk mailing list about ruby memory and GC, and I think it's ready

17 messages 2006/02/27

Re: [ ruby-Bugs-3399 ] [PATCH] OS X core dumps when $0 is changed and then loads shared libraries

From: Blair Zajac <blair@...>
Date: 2006-02-02 20:49:35 UTC
List: ruby-core #7291
H.Yamamoto wrote:
> Hello.
> 
> 
>>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
> 
> 
> Interesting, but Starndard C gurantees argc and argv should be modifiable,
> so I think this is OSX's bug.

Agreed that OS X should be able to handle this.  But it appears that even after 
you change argc and argv in the process, you can get the original values back 
with these calls:

extern char ***_NSGetArgv(void);
extern int *_NSGetArgc(void);
extern char ***_NSGetEnviron(void);

which dyld is presumably doing.

Since argc is passed in to main() and you can't change argc in main() for other 
parts of the OS to see, then this breaks the schematics of argv.

>>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
> 
> 
> If this patch is applied, for example after set_arg0
> origargv[i] (i >= 1) can point to the location which is filled with ' ',
> and can be unterminated with '\0' like this
> 
>   "fooboofoo\0                   ?"
>                    ^
>                    origargv[1]
> 
>   if '?' != '\0', strlen(origargv[i]) will access out of memory block
> 
> 
> How about this? This is shorter, probably safer.

Looks good.  I've attached another patch based off your patch which does to 
following:

1) Repoints any origargv[] that now point into the new $0 string to the \0 
terminating $0.  This will prevent any problems of command line arguments seeing 
parts of $0.

2) In the if (len == 0) statement, rename 'i' and 's' to 'j' and 's1' to prevent 
shadowing of the same variable names at the top of the function.  This is a 
style matter.

3) Changed a tab into 4 spaces to fix indentation.

Regards,
Blair

-- 
Blair Zajac, Ph.D.
CTO, OrcaWare Technologies
<blair@orcaware.com>
Subversion training, consulting and support
http://www.orcaware.com/svn/

Attachments (1)

ruby-osx-core-dump-patch.txt (1.6 KB, text/plain)
--- ruby.c.orig	2005-12-11 16:36:52.000000000 -0800
+++ ruby.c	2006-02-02 12:38:41.000000000 -0800
@@ -1033,43 +1033,47 @@
     rb_progname = rb_tainted_str_new(s, i);
 #else
     if (len == 0) {
-	char *s = origargv[0];
-	int i;
+	char *s1 = origargv[0];
+	int j;
 
-	s += strlen(s);
+	s1 += strlen(s1);
 	/* See if all the arguments are contiguous in memory */
-	for (i = 1; i < origargc; i++) {
-	    if (origargv[i] == s + 1) {
-		s++;
-		s += strlen(s);	/* this one is ok too */
+	for (j = 1; j < origargc; j++) {
+	    if (origargv[j] == s1 + 1) {
+		s1++;
+		s1 += strlen(s1);	/* this one is ok too */
 	    }
 	    else {
 		break;
 	    }
 	}
 #ifndef DOSISH
-	if (s + 1 == envspace.begin) {
-	    s = envspace.end;
+	if (s1 + 1 == envspace.begin) {
+	    s1 = envspace.end;
 	    ruby_setenv("", NULL); /* duplicate environ vars */
 	}
 #endif
-	len = s - origargv[0];
+	len = s1 - origargv[0];
     }
 
     if (i >= len) {
 	i = len;
-	memcpy(origargv[0], s, i);
-	origargv[0][i] = '\0';
     }
-    else {
-	memcpy(origargv[0], s, i);
-	s = origargv[0]+i;
-	*s++ = '\0';
-	while (++i < len)
-	    *s++ = ' ';
-	for (i = 1; i < origargc; i++)
-	    origargv[i] = 0;
+    memcpy(origargv[0], s, i);
+    memset(origargv[0] + i, '\0', len - i + 1);
+
+    /* If the new program name is longer than the original one, then
+     * have any command line arguments that were written over be
+     * empty strings. */
+    s = origargv[0] + i;
+    for (i = 1; i < origargc; ++i) {
+	if (origargv[i] < s ) {
+	    origargv[i] = s;
+	} else {
+	    break;
+	}
     }
+
     rb_progname = rb_tainted_str_new2(origargv[0]);
 #endif
 }

In This Thread

Prev Next