Re: Does anyone use xterm on NetBSD/m68k 7.0?

[email protected] (Michael van Elst)
Newsgroups gmane.os.netbsd.ports.m68k
Organization Serpens User Group
Message-ID <[email protected]>
[email protected] (Rin Okuyama) writes:

>On 2015/11/09 3:37, Michael van Elst wrote:
>> but the parent process didn't fail.

>Hmm, that's strange. Any ideas?

Looks like I missed an indirection for prepareq which is ok.

This here is from the parent process before entering fork():

prepareq
$a5+0x560c: 0x0e4dbf78
0xe4dbf78:      0x0e4e76e0 (first)
0xe4dbf7c:      0x0e4e76e0 (last)

0xe4e76e0:      0x00000000 (next)
0xe4e76e4:      0x0e4687b8 (fn)

parentq
$a5+0x5618: 0x0e4dbf70
0xe4dbf70:      0x0e6020a8 (first)
0xe4dbf74:      0x0e6020a8 (last)

0xe6020a8:      0x00000000 (next)
0xe6020ac:      0x0e468792 (fn)

childq
$a5+0x5b6c: 0x0e4dbf68
0xe4dbf68:      0x0e6020b0 (first)
0xe4dbf6c:      0x0e6020b0 (last)

0xe6020b0:      0x137c54e0 (next)
0xe6020b4:      0x42f1bfa0 (fn)

You see that the damaged data is different from the previous attempt
and every run will show different data.

Tracing reveals that the location is trashed by arc4random_uniform():

#0  0x0e49e906 in memcpy () from /usr/lib/libc.so.12
#1  0x0e468f2a in ?? () from /usr/lib/libc.so.12
#2  0x0e468fc6 in ?? () from /usr/lib/libc.so.12
#3  0x0e469222 in ?? () from /usr/lib/libc.so.12
#4  0x0e4695a6 in arc4random_uniform () from /usr/lib/libc.so.12
#5  0x0e42afca in __gettemp () from /usr/lib/libc.so.12
#6  0x0e3ee8c6 in mkdtemp () from /usr/lib/libc.so.12
#7  0x0002a24a in init_colored_cursor ()
#8  0x0003ec8a in main ()

arc4random_uniform
-> arc4random_prng_get (0xe469088)
   -> arc4random_prng_addrandom (0xe468f68)
      -> crypto_prng_buf (0xe468ea6)
         -> memcpy (0xe3e23c4)

This is arc4random.c:329

        (void)memcpy(prng->state, output, sizeof prng->state);
prng->state = 0x0e6020b0
output = 0x1dffe3a8
sizeof prng->state = 0x00000020

The wrong prng->state pointer however is already passed to
arc4random_prng_addrandom as a result of thr_getspecific().

   0xe469146:   movel %a2@(24),%sp@-
   0xe46914a:   bsrl 0xe3ded64 <__libc_thr_getspecific@plt>
   0xe469150:   addql #4,%sp
   0xe469152:   tstl %a0
   0xe469154:   bnew 0xe46920c

__libc_thr_getspecific however points to _Xthr_zero_stub_.

   0xe280788 <_Xthr_zero_stub_>:        linkw %fp,#0
   0xe28078c <_Xthr_zero_stub_+4>:      clrl %d0
   0xe28078e <_Xthr_zero_stub_+6>:      unlk %fp
   0xe280790 <_Xthr_zero_stub_+8>:      rts

This is a no-threading hack in libX11:

#pragma weak pthread_getspecific = _Xthr_zero_stub_
static int
_Xthr_zero_stub_()
{
    return(0);
}

Since that function is declared as returning an int, only register d0
is set, but a function returning a pointer must use register a0 for
the return value as defined by the m68k ABI.

The broken code can be found in xsrc/external/mit/libX11/src/UIThrStubs.c.
As we already provide no-thread compatibility functions in libc (with
a working pthread_getspecific implementation) it might also help to
get rid of this UIThrStubs nonsense.

-- 
-- 
                                Michael van Elst
Internet: [email protected]
                                "A potential Snark may lurk in every tree."
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.