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

Reply via email to