Author: Brian Kearns <[email protected]>
Branch: stdlib-2.7.6
Changeset: r69619:f99551340203
Date: 2014-03-02 12:03 -0500
http://bitbucket.org/pypy/pypy/changeset/f99551340203/
Log: correctness fixes for pwd module
diff --git a/pypy/module/pwd/interp_pwd.py b/pypy/module/pwd/interp_pwd.py
--- a/pypy/module/pwd/interp_pwd.py
+++ b/pypy/module/pwd/interp_pwd.py
@@ -3,32 +3,38 @@
from rpython.rtyper.lltypesystem import rffi, lltype
from pypy.interpreter.error import OperationError, oefmt
from pypy.interpreter.gateway import unwrap_spec
-from rpython.rlib.rarithmetic import intmask
+from rpython.rlib.rarithmetic import intmask, most_pos_value_of
-eci = ExternalCompilationInfo(
- includes=['pwd.h']
-)
+eci = ExternalCompilationInfo(includes=['pwd.h'])
class CConfig:
_compilation_info_ = eci
uid_t = rffi_platform.SimpleType("uid_t")
+ gid_t = rffi_platform.SimpleType("gid_t")
+
+config = rffi_platform.configure(CConfig)
+
+uid_t = config['uid_t']
+gid_t = config['gid_t']
+
+class CConfig:
+ _compilation_info_ = eci
passwd = rffi_platform.Struct(
'struct passwd',
[('pw_name', rffi.CCHARP),
('pw_passwd', rffi.CCHARP),
- ('pw_uid', rffi.INT),
- ('pw_gid', rffi.INT),
+ ('pw_uid', uid_t),
+ ('pw_gid', gid_t),
('pw_gecos', rffi.CCHARP),
('pw_dir', rffi.CCHARP),
- ('pw_shell', rffi.CCHARP),
- ])
+ ('pw_shell', rffi.CCHARP)])
config = rffi_platform.configure(CConfig)
+
passwd_p = lltype.Ptr(config['passwd'])
-uid_t = config['uid_t']
def external(name, args, result, **kwargs):
return rffi.llexternal(name, args, result, compilation_info=eci, **kwargs)
@@ -63,10 +69,13 @@
"""
try:
uid = space.int_w(w_uid)
+ if uid < -1 or uid > most_pos_value_of(uid_t):
+ raise OperationError(space.w_OverflowError, None)
except OperationError, e:
if e.match(space, space.w_OverflowError):
raise oefmt(space.w_KeyError, "getpwuid(): uid not found")
raise
+ uid = rffi.cast(uid_t, uid)
pw = c_getpwuid(uid)
if not pw:
raise oefmt(space.w_KeyError, "getpwuid(): uid not found: %d", uid)
diff --git a/pypy/module/pwd/test/test_pwd.py b/pypy/module/pwd/test/test_pwd.py
--- a/pypy/module/pwd/test/test_pwd.py
+++ b/pypy/module/pwd/test/test_pwd.py
@@ -8,7 +8,7 @@
spaceconfig = dict(usemodules=['pwd'])
def test_getpwuid(self):
- import pwd, sys
+ import pwd, sys, re
raises(KeyError, pwd.getpwuid, -1)
pw = pwd.getpwuid(0)
assert pw.pw_name == 'root'
@@ -22,13 +22,19 @@
assert pw.pw_shell.startswith('/')
assert type(pw.pw_uid) is int
assert type(pw.pw_gid) is int
- # should be out of uid_t range
raises(TypeError, pwd.getpwuid)
raises(TypeError, pwd.getpwuid, 3.14)
raises(KeyError, pwd.getpwuid, sys.maxint)
- raises(KeyError, pwd.getpwuid, -1)
- raises(KeyError, pwd.getpwuid, 2**128)
- raises(KeyError, pwd.getpwuid, -2**128)
+ # -1 is allowed, cast to uid_t
+ exc = raises(KeyError, pwd.getpwuid, -1)
+ m = re.match('getpwuid\(\): uid not found: ([0-9]+)', exc.value[0])
+ assert m
+ maxval = int(m.group(1))
+ assert maxval >= 2**32 - 1
+ # should be out of uid_t range
+ for v in [-2, maxval+1, 2**128, -2**128]:
+ exc = raises(KeyError, pwd.getpwuid, v)
+ assert exc.value[0] == 'getpwuid(): uid not found'
def test_getpwnam(self):
import pwd
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit