mirror of https://github.com/python/cpython
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. This should be backported to release25-maint.
This commit is contained in:
parent
8906575380
commit
f48da8fbcd
|
@ -9,6 +9,7 @@ except ImportError:
|
||||||
|
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
|
import pwd
|
||||||
import unittest
|
import unittest
|
||||||
import warnings
|
import warnings
|
||||||
warnings.filterwarnings('ignore', '.* potential security risk .*',
|
warnings.filterwarnings('ignore', '.* potential security risk .*',
|
||||||
|
@ -141,6 +142,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)
|
||||||
|
|
|
@ -1881,9 +1881,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;
|
||||||
|
|
Loading…
Reference in New Issue