[Python-checkins] r77008 - in python/branches/release26-maint: Lib/test/test_posix.py Misc/NEWS Modules/posixmodule.c

gregory.p.smith python-checkins at python.org
Wed Dec 23 10:46:54 CET 2009


Author: gregory.p.smith
Date: Wed Dec 23 10:46:53 2009
New Revision: 77008

Log:
Merged revisions 77007 via svnmerge from 
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r77007 | gregory.p.smith | 2009-12-23 01:31:11 -0800 (Wed, 23 Dec 2009) | 3 lines
  
  Fix possible integer overflow in lchown and fchown functions.  For issue1747858.
........


Modified:
   python/branches/release26-maint/   (props changed)
   python/branches/release26-maint/Lib/test/test_posix.py
   python/branches/release26-maint/Misc/NEWS
   python/branches/release26-maint/Modules/posixmodule.c

Modified: python/branches/release26-maint/Lib/test/test_posix.py
==============================================================================
--- python/branches/release26-maint/Lib/test/test_posix.py	(original)
+++ python/branches/release26-maint/Lib/test/test_posix.py	Wed Dec 23 10:46:53 2009
@@ -143,32 +143,61 @@
         if hasattr(posix, 'stat'):
             self.assert_(posix.stat(test_support.TESTFN))
 
+    def _test_all_chown_common(self, chown_func, first_param):
+        """Common code for chown, fchown and lchown tests."""
+        if os.getuid() == 0:
+            try:
+                # Many linux distros have a nfsnobody user as MAX_UID-2
+                # that makes a good test case for signedness issues.
+                #   http://bugs.python.org/issue1747858
+                # This part of the test only runs when run as root.
+                # Only scary people run their tests as root.
+                ent = pwd.getpwnam('nfsnobody')
+                chown_func(first_param, ent.pw_uid, ent.pw_gid)
+            except KeyError:
+                pass
+        else:
+            # non-root cannot chown to root, raises OSError
+            self.assertRaises(OSError, chown_func,
+                              first_param, 0, 0)
+
+        # test a successful chown call
+        chown_func(first_param, os.getuid(), os.getgid())
+
+    def _test_chown(self):
+        # raise an OSError if the file does not exist
+        os.unlink(test_support.TESTFN)
+        self.assertRaises(OSError, posix.chown, test_support.TESTFN, -1, -1)
+
+        # re-create the file
+        open(test_support.TESTFN, 'w').close()
+        self._test_all_chown_common(posix.chown, test_support.TESTFN)
+
     if hasattr(posix, 'chown'):
-        def test_chown(self):
-            # raise an OSError if the file does not exist
-            os.unlink(test_support.TESTFN)
-            self.assertRaises(OSError, posix.chown, test_support.TESTFN, -1, -1)
-
-            # re-create the file
-            open(test_support.TESTFN, 'w').close()
-            if os.getuid() == 0:
-                try:
-                    # Many linux distros have a nfsnobody user as MAX_UID-2
-                    # that makes a good test case for signedness issues.
-                    #   http://bugs.python.org/issue1747858
-                    # This part of the test only runs when run as root.
-                    # Only scary people run their tests as root.
-                    ent = pwd.getpwnam('nfsnobody')
-                    posix.chown(test_support.TESTFN, ent.pw_uid, ent.pw_gid)
-                except KeyError:
-                    pass
-            else:
-                # non-root cannot chown to root, raises OSError
-                self.assertRaises(OSError, posix.chown,
-                                  test_support.TESTFN, 0, 0)
+        test_chown = _test_chown
+
+    def _test_fchown(self):
+        os.unlink(test_support.TESTFN)
+
+        # re-create the file
+        test_file = open(test_support.TESTFN, 'w')
+        try:
+            fd = test_file.fileno()
+            self._test_all_chown_common(posix.fchown, fd)
+        finally:
+            test_file.close()
+
+    if hasattr(posix, 'fchown'):
+        test_fchown = _test_fchown
+
+    def _test_lchown(self):
+        os.unlink(test_support.TESTFN)
+        # create a symlink
+        os.symlink('/tmp/dummy-symlink-target', test_support.TESTFN)
+        self._test_all_chown_common(posix.lchown, test_support.TESTFN)
 
-            # test a successful chown call
-            posix.chown(test_support.TESTFN, os.getuid(), os.getgid())
+    if hasattr(posix, 'lchown'):
+        test_lchown = _test_lchown
 
     def test_chdir(self):
         if hasattr(posix, 'chdir'):

Modified: python/branches/release26-maint/Misc/NEWS
==============================================================================
--- python/branches/release26-maint/Misc/NEWS	(original)
+++ python/branches/release26-maint/Misc/NEWS	Wed Dec 23 10:46:53 2009
@@ -32,6 +32,10 @@
 - Issue #7084: Fix a (very unlikely) crash when printing a list from one
   thread, and mutating it from another one.  Patch by Scott Dial.
 
+- Issue #1747858: Fix lchown & fchown to work with large uid's and gid's on
+  64-bit platforms.
+
+
 Library
 -------
 

Modified: python/branches/release26-maint/Modules/posixmodule.c
==============================================================================
--- python/branches/release26-maint/Modules/posixmodule.c	(original)
+++ python/branches/release26-maint/Modules/posixmodule.c	Wed Dec 23 10:46:53 2009
@@ -1923,9 +1923,10 @@
 static PyObject *
 posix_fchown(PyObject *self, PyObject *args)
 {
-	int fd, uid, gid;
+	int fd;
+	long uid, gid;
 	int res;
-	if (!PyArg_ParseTuple(args, "iii:chown", &fd, &uid, &gid))
+	if (!PyArg_ParseTuple(args, "ill:chown", &fd, &uid, &gid))
 		return NULL;
 	Py_BEGIN_ALLOW_THREADS
 	res = fchown(fd, (uid_t) uid, (gid_t) gid);
@@ -1946,9 +1947,9 @@
 posix_lchown(PyObject *self, PyObject *args)
 {
 	char *path = NULL;
-	int uid, gid;
+	long uid, gid;
 	int res;
-	if (!PyArg_ParseTuple(args, "etii:lchown",
+	if (!PyArg_ParseTuple(args, "etll:lchown",
 	                      Py_FileSystemDefaultEncoding, &path,
 	                      &uid, &gid))
 		return NULL;


More information about the Python-checkins mailing list