Re: PR_GetThreadID() fails with SEGV
Jon Leighton <[email protected]> Tue, 07 Jul 2009 02:09:57 -0400
| Newsgroups | gmane.comp.mozilla.devel.nspr |
|---|---|
| Message-ID | <[email protected]> |
Julien R Pierre - Sun Microsystems wrote:
> Jonathan,
>
> Jonathan Leighton wrote:
>
>>> Please provide a crash stack. Even for a deprecated function, I would
>>> not expect a crash. Are you passing a valid PRThread* pointer ?
>>
>> Hi Julien -
>>
>> I haven't yet tried to create a simple case where this fails, but
>> where I ran into the problem was in NSPR 4.8's socket.c test code.
>> Line 501 is:
>>
>> DPRINTF(("TCP_Server: Created Serve_Client = 0x%lx\n", t));
>>
>> If I replace "t" with "PR_GetThreadID(t)" I get a SEGV on line 1097 of
>> ptthread.c. I found this to happen in Solaris 5.10 and OpenSolaris
>> 5.11, but not in FreeBSD 7.2, Linux 2.6.28, or Mac OS X 10.5.6
>> (Intel). Below is the output from dbx on Solarix 5.10.
>>
>> - Jon
>>
>> .
>> .
>> .
>> t@2 (l@2) signal SEGV (no mapping at the fault address) in
>> PR_GetThreadID at line 1097 in file "ptthread.c"
>> 1097 return (PRUint32)thred->id; /* and I don't know what they
>> will do with it */
>> (dbx) where
>> current thread: t@2
>> =>[1] PR_GetThreadID(thred = 0xa), line 1097 in "ptthread.c"
>> [2] TCP_Server(arg = 0x8068af0), line 501 in "socket.c"
>> [3] _pt_root(arg = 0x806b408), line 228 in "ptthread.c"
>> [4] _thr_setup(0xfea50200), at 0xfeea7055
>> [5] _lwp_start(0x1, 0xfeb5efac, 0x8052a93, 0xa, 0x0, 0xfea50200), at
>> 0xfeea7340
>> (dbx)
>
> Sorry for the late answer.
>
> Your stack clearly shows an invalid PRThread pointer (thred = 0xa) being
> passed to PR_GetThreadID.
>
> I was able to reproduce this crash. Even when not setting the _debug_on
> global variable, and simply fetching the thread id in a local like this,
> in the TCP_Server function :
>
> {
> int tid = PR_GetThreadID(t);
> }
>
> It turns out there is some memory corruption in this test program.
> The dbx "check -all" feature reports several "read from unallocated"
> from multiple threads. I haven't narrowed down the cause of the
> corruption exactly. Please file a bug on this.
Hi Julien -
Thanks for getting back to me. I just filed the bug report. The
problem seems to be that the create_new_thread() routine is returning a
thread pointer that only has local scope. It's easily fixed.
- Jon