Issue 3586: pwd.getpwnam('nobody') produces incorrect results if sizeof(uid_t) < sizeof(long) (original) (raw)
On a 64-bit OS X build of Python, built with:
./configure --with-universal-archs=64-bit --enable-universalsdk=/ MACOSX_DEPLOYMENT_TARGET=10.5 && make
I get the following result:
Python 2.6b2+ (trunk:65805M, Aug 18 2008, 10:59:08) [GCC 4.0.1 (Apple Inc. build 5484)] on darwin Type "help", "copyright", "credits" or "license" for more information.
import pwd pwd.getpwnam('nobody') pwd.struct_passwd(pw_name='nobody', pw_passwd='*', pw_uid=4294967294, pw_gid=4294967294, pw_gecos='Unprivileged User', pw_dir='/var/empty', pw_shell='/usr/bin/false')
Here the pw_uid and pw_gid should presumably be -2, not 4294967294. I haven't had time to investigate properly, but the problem is almost certainly something to do with the fact that sizeof(uid_t) is 4 and sizeof(long) is 8 for this build. (Though interestingly, the configure script detects sizeof(long) as 4, which may not be helping matters.)
This problem is causing test_httpservers to fail on 64-bit OS X.
System info: it's a MacBook Pro; uname -a gives: Darwin Macintosh-3.local 9.4.0 Darwin Kernel Version 9.4.0: Mon Jun 9 19:30:53 PDT 2008; root:xnu- 1228.5.20~1/RELEASE_I386 i386
It turns out that uid_t (and gid_t) actually is an unsigned 32-bit integer type on OS X 10.5, so perhaps the pw_uid and pw_gid values are correct. So to rephrase: one or both of the following facts might be considered bugs:
(1) On a single machine, the value of pwd.getpwnam('nobody') gives different results for 32-bit and 64-bit builds of Python (pw_uid is -2 on 32-bit, 2**32-2 on 64-bit).
(2) On a 64-bit OS X build, pwd.getpwnam can produce uids and gids >= 231, but os.setuid and friends don't accept values larger than 231-1. There's an inconsistency between pwdmodule.c and posixmodule.c: pwdmodule casts uids to C longs before returning them, while the posixmodule.c functions parse an input uid/gid using the "i" format in PyArg_Parse*.
It's the latter problem that's causing test_httpservers to fail on 64-bit OS X.