mirror of
https://github.com/python/cpython.git
synced 2025-08-14 22:01:08 +00:00
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. ........
This commit is contained in:
parent
25339af98d
commit
21c134d0e3
3 changed files with 61 additions and 27 deletions
|
@ -143,32 +143,61 @@ class PosixTester(unittest.TestCase):
|
|||
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)
|
||||
test_chown = _test_chown
|
||||
|
||||
# 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)
|
||||
def _test_fchown(self):
|
||||
os.unlink(test_support.TESTFN)
|
||||
|
||||
# test a successful chown call
|
||||
posix.chown(test_support.TESTFN, os.getuid(), os.getgid())
|
||||
# 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)
|
||||
|
||||
if hasattr(posix, 'lchown'):
|
||||
test_lchown = _test_lchown
|
||||
|
||||
def test_chdir(self):
|
||||
if hasattr(posix, 'chdir'):
|
||||
|
|
|
@ -32,6 +32,10 @@ Core and Builtins
|
|||
- 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
|
||||
-------
|
||||
|
||||
|
|
|
@ -1923,9 +1923,10 @@ fd to the numeric uid and gid.");
|
|||
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 @@ static PyObject *
|
|||
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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue