classification
Title: pwd.getpwnam('nobody') produces incorrect results if sizeof(uid_t) < sizeof(long)
Type: Stage:
Components: Extension Modules Versions: Python 3.0, Python 3.1, Python 2.7, Python 2.6
process
Status: closed Resolution: fixed
Dependencies: 5705 Superseder:
Assigned To: gregory.p.smith Nosy List: gregory.p.smith, mark.dickinson
Priority: normal Keywords: 64bit

Created on 2008-08-18 10:22 by mark.dickinson, last changed 2009-04-06 21:43 by mark.dickinson. This issue is now closed.

Messages (5)
msg71318 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2008-08-18 10:22
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
msg71320 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2008-08-18 11:49
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 >= 
2**31, but os.setuid and friends don't accept values larger than 2**31-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.
msg71350 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2008-08-18 16:49
Issue 1747858 looks closely related.  I propose extending the simple fix 
used there, parsing all uids and gids as longs rather than ints.
msg85649 - (view) Author: Gregory P. Smith (gregory.p.smith) * (Python committer) Date: 2009-04-06 16:14
Fixed via issue5705 which I filed not having seen this one.
msg85671 - (view) Author: Mark Dickinson (mark.dickinson) * (Python committer) Date: 2009-04-06 21:43
I'd completely forgotten about this issue!

Indeed, test_httpservers now seems to be passing on a 64-bit build
on my machine.  Thank you!
History
Date User Action Args
2009-04-06 21:43:05mark.dickinsonsetmessages: + msg85671
2009-04-06 16:14:30gregory.p.smithsetstatus: open -> closed

dependencies: + os.getpwent returns unsigned 32bit value, os.setuid refuses it
assignee: gregory.p.smith
versions: + Python 3.0, Python 3.1, Python 2.7
keywords: + 64bit
nosy: + gregory.p.smith

messages: + msg85649
resolution: fixed
2008-08-18 16:49:12mark.dickinsonsetmessages: + msg71350
2008-08-18 11:49:56mark.dickinsonsetmessages: + msg71320
2008-08-18 10:22:44mark.dickinsoncreate