Commit 631df755 authored by Gregory P. Smith's avatar Gregory P. Smith

Backport r61450 from trunk:

 Fix chown on 64-bit linux.  It needed to take a long (64-bit on 64bit linux) as
 uid and gid input to accept values >=2**31 as valid while still accepting
 negative numbers to pass -1 to chown for "no change".

 Fixes issue1747858.
parent 549171e1
...@@ -9,6 +9,7 @@ except ImportError: ...@@ -9,6 +9,7 @@ except ImportError:
import time import time
import os import os
import pwd
import sys import sys
import unittest import unittest
import warnings import warnings
...@@ -142,6 +143,33 @@ class PosixTester(unittest.TestCase): ...@@ -142,6 +143,33 @@ class PosixTester(unittest.TestCase):
if hasattr(posix, 'stat'): if hasattr(posix, 'stat'):
self.assert_(posix.stat(test_support.TESTFN)) self.assert_(posix.stat(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 a successful chown call
posix.chown(test_support.TESTFN, os.getuid(), os.getgid())
def test_chdir(self): def test_chdir(self):
if hasattr(posix, 'chdir'): if hasattr(posix, 'chdir'):
posix.chdir(os.curdir) posix.chdir(os.curdir)
......
...@@ -1779,9 +1779,9 @@ static PyObject * ...@@ -1779,9 +1779,9 @@ static PyObject *
posix_chown(PyObject *self, PyObject *args) posix_chown(PyObject *self, PyObject *args)
{ {
char *path = NULL; char *path = NULL;
int uid, gid; long uid, gid;
int res; int res;
if (!PyArg_ParseTuple(args, "etii:chown", if (!PyArg_ParseTuple(args, "etll:chown",
Py_FileSystemDefaultEncoding, &path, Py_FileSystemDefaultEncoding, &path,
&uid, &gid)) &uid, &gid))
return NULL; return NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment