Subject: compat/linux32: getpid() returning wrong pid after clone()
To: None <port-amd64@NetBSD.org>
From: =?ISO-8859-1?Q?Edgar_Fu=DF?= <ef@math.uni-bonn.de>
List: port-amd64
Date: 03/15/2007 21:57:03
I'm confused.
(Syscall #158 actually is implemented in the kernel I'm using. I  
simply don't know how to tell kdump it is.)

   5183      1 dsmc     RET   clone 5247/0x147f
   5183      1 dsmc     CALL  kill(0x83b, SIGRT0)
   5183      1 dsmc     RET   kill 0
   2107      1 dsmc     RET   rt_sigsuspend -1 unknown errno 4
   2107      1 dsmc     PSIG  SIGRT0 caught handler=0xfbf663d0 mask= 
(2,3,15,24,25,32))
   2107      1 dsmc     CALL  sigreturn(0xffffcbdc)
   2107      1 dsmc     RET   sigreturn -1 errno -2 No such file or  
directory
   2107      1 dsmc     CALL  #158 (unimplemented sched_yield)
   5247      1 dsmc     EMUL  "linux32"
   5247      1 dsmc     RET   fork 0
   5247      1 dsmc     CALL  getpid
   5247      1 dsmc     RET   getpid 2107/0x83b

I've been staring at this for minutes now, but probably others concur  
that getpid(2) does not return what one would expect.

I've been unable to build a linux program exhibiting the same  
behaviour myself, but I'm by far no linux expert.

Looks like either clone(2) or getpid(2) is seriously broken, isn't  
it? However, digging through the sources I can't find anything  
obviously wrong.

Same thing works correctly on NetBSD/32 in emul/linux.

Another point is I'm noting lots of "unknown errno x" with x being  
positive.