Author: Brian Kearns <bdkea...@gmail.com>
Branch: stdlib-2.7.6
Changeset: r69627:c212634712e1
Date: 2014-03-02 21:24 -0500
http://bitbucket.org/pypy/pypy/changeset/c212634712e1/

Log:    fix pwd on 32bit?

diff --git a/pypy/interpreter/error.py b/pypy/interpreter/error.py
--- a/pypy/interpreter/error.py
+++ b/pypy/interpreter/error.py
@@ -372,7 +372,6 @@
     return OpErrFmt, strings
 
 class OpErrFmtNoArgs(OperationError):
-
     def __init__(self, w_type, value):
         self._value = value
         self.setup(w_type)
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,7 +3,6 @@
 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, most_pos_value_of, widen
 
 
 eci = ExternalCompilationInfo(includes=['pwd.h'])
@@ -51,8 +50,8 @@
     w_tuple = space.newtuple([
         space.wrap(rffi.charp2str(pw.c_pw_name)),
         space.wrap(rffi.charp2str(pw.c_pw_passwd)),
-        space.wrap(intmask(pw.c_pw_uid)),
-        space.wrap(intmask(pw.c_pw_gid)),
+        space.wrap(pw.c_pw_uid),
+        space.wrap(pw.c_pw_gid),
         space.wrap(rffi.charp2str(pw.c_pw_gecos)),
         space.wrap(rffi.charp2str(pw.c_pw_dir)),
         space.wrap(rffi.charp2str(pw.c_pw_shell)),
@@ -67,18 +66,22 @@
     Return the password database entry for the given numeric user ID.
     See pwd.__doc__ for more on password database entries.
     """
+    msg = "getpwuid(): uid not found"
     try:
-        uid = space.int_w(w_uid)
-        if uid < -1 or uid > widen(most_pos_value_of(uid_t)):
+        val = space.int_w(w_uid)
+        uid = rffi.cast(uid_t, val)
+        if val == -1:
+            pass
+        elif val < 0 or uid != val:
             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 oefmt(space.w_KeyError, msg)
         raise
-    uid = rffi.cast(uid_t, uid)
     pw = c_getpwuid(uid)
     if not pw:
-        raise oefmt(space.w_KeyError, "getpwuid(): uid not found: %d", 
widen(uid))
+        raise OperationError(space.w_KeyError, space.wrap(
+            "%s: %d" % (msg, uid)))
     return make_struct_passwd(space, pw)
 
 
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
@@ -28,9 +28,13 @@
         # -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
+        assert m, exc.value[0]
         maxval = int(m.group(1))
         assert maxval >= 2**32 - 1
+        # shouldn't overflow
+        exc = raises(KeyError, pwd.getpwuid, maxval)
+        m = re.match('getpwuid\(\): uid not found: ([0-9]+)', exc.value[0])
+        assert m, exc.value[0]
         # should be out of uid_t range
         for v in [-2, maxval+1, 2**128, -2**128]:
             exc = raises(KeyError, pwd.getpwuid, v)
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to