Hello,
I've checked with NetBSD-current from today (2020-02-02) and
pkgsrc-current (2020-02-02) and package firefox-72.0.2.
I'm not reproducing any crash due to pthread_equal(3) misuse. Everything
I tested, worked for me.
Please try PTHREAD_DIAGASSERT=ae and debug the culprit crash with a
core(5) file.
On 01.02.2020 22:20, Kamil Rytarowski wrote:
> Good idea. It could be checked quicker... however I presume that
> t1->pt_magic + t1->pt_magic already crash on invalid t1/t2 pointers as
> the argument with condition is evaluated.
>
> Ryo, you might check:
> $ export PTHREAD_DIAGASSERT=ae
> $ firefox
>
> It should create a coredump for investigation.
>
> According to POSIX
> (https://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_equal.html)
> passing invalid parameters is UB.
>
> GLIBC, Illumos and all other BSDs (+ older NetBSD) have no sanity check
> in pthread_equal(3). Apparently we are the first ones to notice the bug.
>
> On 01.02.2020 21:18, Andrew Doran wrote:
>> Hmm. Was there not originally an environment variable to control this
>> behaviour, since many applications are buggy?
>>
>> Andrew
>>
>> On Sun, Feb 02, 2020 at 01:01:49AM +0900, Ryo ONODERA wrote:
>>> Hi,
>>>
>>> pthread__error()s in pthread_equal() cause segfault
>>> during start of pkgsrc/www/firefox-72.0.2.
>>>
>>> Without pthread__error()s, www/firefox works fine
>>> like as follows.
>>> However I have no idea why I get segfaults.
>>>
>>> Could you take a look at this problem?
>>>
>>> Index: lib/libpthread/pthread.c
>>> ===================================================================
>>> RCS file: /cvsroot/src/lib/libpthread/pthread.c,v
>>> retrieving revision 1.162
>>> diff -u -r1.162 pthread.c
>>> --- lib/libpthread/pthread.c 29 Jan 2020 17:11:57 -0000 1.162
>>> +++ lib/libpthread/pthread.c 1 Feb 2020 15:58:03 -0000
>>> @@ -770,11 +770,13 @@
>>> if (__predict_false(__uselibcstub))
>>> return __libc_thr_equal_stub(t1, t2);
>>>
>>> +#if 0
>>> pthread__error(EINVAL, "Invalid thread",
>>> t1->pt_magic == PT_MAGIC);
>>>
>>> pthread__error(EINVAL, "Invalid thread",
>>> t2->pt_magic == PT_MAGIC);
>>> +#endif
>>>
>>> /* Nothing special here. */
>>> return (t1 == t2);
>>> @@ -1108,7 +1110,7 @@
>>> {
>>> char buf[1024];
>>> size_t len;
>>> -
>>> +
>>> if (pthread__diagassert == 0)
>>> return;
>>>
>>>
>>>
>>> "Kamil Rytarowski" <kamil%netbsd.org@localhost> writes:
>>>
>>>> Module Name: src
>>>> Committed By: kamil
>>>> Date: Wed Jan 29 16:03:44 UTC 2020
>>>>
>>>> Modified Files:
>>>> src/lib/libpthread: pthread.c pthread_getcpuclockid.c
>>>>
>>>> Log Message:
>>>> Chack thread->pt_magic with PT_MAGIC promptly
>>>>
>>>> Rearrange some checks to avoid verifying pthread_t after using it.
>>>>
>>>>
>>>> To generate a diff of this commit:
>>>> cvs rdiff -u -r1.160 -r1.161 src/lib/libpthread/pthread.c
>>>> cvs rdiff -u -r1.2 -r1.3 src/lib/libpthread/pthread_getcpuclockid.c
>>>>
>>>> Please note that diffs are not public domain; they are subject to the
>>>> copyright notices on the relevant files.
>>>>
>>>
>>> --
>>> Ryo ONODERA // ryo%tetera.org@localhost
>>> PGP fingerprint = 82A2 DC91 76E0 A10A 8ABB FD1B F404 27FA C7D1 15F3
>
>
Attachment:
signature.asc
Description: OpenPGP digital signature