Author: Armin Rigo <[email protected]>
Branch: stdlib-2.7.4
Changeset: r66081:3725099b37be
Date: 2013-08-12 09:47 +0200
http://bitbucket.org/pypy/pypy/changeset/3725099b37be/

Log:    Merged in andrewsmedina/numpypy/stdlib-2.7.4-pwd-fix (pull request
        #175)

        fixed support for pwd stdlib 2.7.4

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
@@ -2,9 +2,22 @@
 from rpython.rtyper.tool import rffi_platform
 from rpython.rtyper.lltypesystem import rffi, lltype
 from pypy.interpreter.gateway import unwrap_spec
-from pypy.interpreter.error import operationerrfmt
+from pypy.interpreter.error import OperationError, operationerrfmt
 from rpython.rlib.rarithmetic import intmask
 
+import sys
+
+
+if sys.maxint == 2147483647:
+    def check_uid_range(space, num):
+        pass
+else:
+    def check_uid_range(space, num):
+        if num < -(1<<31) or num >= (1<<32):
+            msg = "getpwuid(): uid not found"
+            raise OperationError(space.w_KeyError, space.wrap(msg))
+
+
 eci = ExternalCompilationInfo(
     includes=['pwd.h']
     )
@@ -52,14 +65,22 @@
         ])
     return space.call_function(w_passwd_struct, w_tuple)
 
-@unwrap_spec(uid=int)
-def getpwuid(space, uid):
+
+def getpwuid(space, w_uid):
     """
     getpwuid(uid) -> (pw_name,pw_passwd,pw_uid,
                       pw_gid,pw_gecos,pw_dir,pw_shell)
     Return the password database entry for the given numeric user ID.
     See pwd.__doc__ for more on password database entries.
     """
+    try:
+        uid = space.int_w(w_uid)
+    except OperationError, e:
+        if e.match(space, space.w_OverflowError):
+            msg = "getpwuid(): uid not found"
+            raise OperationError(space.w_KeyError, space.wrap(msg))
+        raise
+    check_uid_range(space, uid)
     pw = c_getpwuid(uid)
     if not pw:
         raise operationerrfmt(space.w_KeyError,
@@ -92,4 +113,3 @@
     finally:
         c_endpwent()
     return space.newlist(users_w)
-    
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
@@ -20,9 +20,13 @@
         else:
             assert pw.pw_dir.startswith('/')
         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(KeyError, pwd.getpwuid, 2**128)
+        raises(KeyError, pwd.getpwuid, -2**128)
+        raises(KeyError, pwd.getpwuid, (1<<32))
+        raises(KeyError, pwd.getpwuid, -(1<<32))
 
     def test_getpwnam(self):
         import pwd
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to