lbalhar / rpms / python3.5

Forked from rpms/python3.5 3 years ago
Clone
Blob Blame History Raw
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: David Malcolm <dmalcolm@redhat.com>
Date: Fri, 18 May 2012 14:57:53 -0400
Subject: [PATCH] 00157: Update uid/gid handling throughout the standard
 library

uid_t and gid_t are unsigned 32-bit values, but existing code often passed
them through C long values, which are signed 32-bit values on 32-bit
architectures, leading to negative int objects for uid/gid values >= 2^31
on 32-bit architectures.

Introduce _PyObject_FromUid/Gid to convert uid_t/gid_t values to python
objects, using int objects where the value will fit (long objects otherwise),
and _PyArg_ParseUid/Gid to convert int/long to uid_t/gid_t, with -1 allowed
as a special case (since this is given special meaning by the chown syscall)

Update standard library to use this throughout for uid/gid values, so that
very large uid/gid values are round-trippable, and -1 remains usable.
See https://bugzilla.redhat.com/show_bug.cgi?id=697470

Co-authored-by: Bohuslav Kabrda <bkabrda@redhat.com>
---
 Lib/test/test_os.py  | 8 ++++++++
 Lib/test/test_pwd.py | 4 ++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index e2077383bf..61526e75df 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -1715,30 +1715,36 @@ class PosixUidGidTests(unittest.TestCase):
     def test_setuid(self):
         if os.getuid() != 0:
             self.assertRaises(OSError, os.setuid, 0)
+        self.assertRaises(TypeError, os.setuid, 'not an int')
         self.assertRaises(OverflowError, os.setuid, 1<<32)
 
     @unittest.skipUnless(hasattr(os, 'setgid'), 'test needs os.setgid()')
     def test_setgid(self):
         if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
             self.assertRaises(OSError, os.setgid, 0)
+        self.assertRaises(TypeError, os.setgid, 'not an int')
         self.assertRaises(OverflowError, os.setgid, 1<<32)
 
     @unittest.skipUnless(hasattr(os, 'seteuid'), 'test needs os.seteuid()')
     def test_seteuid(self):
         if os.getuid() != 0:
             self.assertRaises(OSError, os.seteuid, 0)
+        self.assertRaises(TypeError, os.seteuid, 'not an int')
         self.assertRaises(OverflowError, os.seteuid, 1<<32)
 
     @unittest.skipUnless(hasattr(os, 'setegid'), 'test needs os.setegid()')
     def test_setegid(self):
         if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
             self.assertRaises(OSError, os.setegid, 0)
+        self.assertRaises(TypeError, os.setegid, 'not an int')
         self.assertRaises(OverflowError, os.setegid, 1<<32)
 
     @unittest.skipUnless(hasattr(os, 'setreuid'), 'test needs os.setreuid()')
     def test_setreuid(self):
         if os.getuid() != 0:
             self.assertRaises(OSError, os.setreuid, 0, 0)
+        self.assertRaises(TypeError, os.setreuid, 'not an int', 0)
+        self.assertRaises(TypeError, os.setreuid, 0, 'not an int')
         self.assertRaises(OverflowError, os.setreuid, 1<<32, 0)
         self.assertRaises(OverflowError, os.setreuid, 0, 1<<32)
 
@@ -1754,6 +1760,8 @@ class PosixUidGidTests(unittest.TestCase):
     def test_setregid(self):
         if os.getuid() != 0 and not HAVE_WHEEL_GROUP:
             self.assertRaises(OSError, os.setregid, 0, 0)
+        self.assertRaises(TypeError, os.setregid, 'not an int', 0)
+        self.assertRaises(TypeError, os.setregid, 0, 'not an int')
         self.assertRaises(OverflowError, os.setregid, 1<<32, 0)
         self.assertRaises(OverflowError, os.setregid, 0, 1<<32)
 
diff --git a/Lib/test/test_pwd.py b/Lib/test/test_pwd.py
index b7b1a4a5f6..2b48e1438d 100644
--- a/Lib/test/test_pwd.py
+++ b/Lib/test/test_pwd.py
@@ -94,9 +94,9 @@ class PwdTest(unittest.TestCase):
         # In some cases, byuids isn't a complete list of all users in the
         # system, so if we try to pick a value not in byuids (via a perturbing
         # loop, say), pwd.getpwuid() might still be able to find data for that
-        # uid. Using sys.maxint may provoke the same problems, but hopefully
+        # uid. Using 2**32 - 2 may provoke the same problems, but hopefully
         # it will be a more repeatable failure.
-        fakeuid = sys.maxsize
+        fakeuid = 2**32 - 2
         self.assertNotIn(fakeuid, byuids)
         self.assertRaises(KeyError, pwd.getpwuid, fakeuid)