Kaydet (Commit) d49e375e authored tarafından Antoine Pitrou's avatar Antoine Pitrou

Issue #1309352: fcntl now converts its third arguments to a C `long` rather

than an int, which makes some operations possible under 64-bit Linux (e.g.
DN_MULTISHOT with F_NOTIFY).
üst 4fe38589
...@@ -61,7 +61,7 @@ class TestFcntl(unittest.TestCase): ...@@ -61,7 +61,7 @@ class TestFcntl(unittest.TestCase):
self.f = None self.f = None
def tearDown(self): def tearDown(self):
if not self.f.closed: if self.f and not self.f.closed:
self.f.close() self.f.close()
unlink(TESTFN) unlink(TESTFN)
...@@ -85,6 +85,21 @@ class TestFcntl(unittest.TestCase): ...@@ -85,6 +85,21 @@ class TestFcntl(unittest.TestCase):
rv = fcntl.fcntl(self.f, fcntl.F_SETLKW, lockdata) rv = fcntl.fcntl(self.f, fcntl.F_SETLKW, lockdata)
self.f.close() self.f.close()
def test_fcntl_64_bit(self):
# Issue #1309352: fcntl shouldn't fail when the third arg fits in a
# C 'long' but not in a C 'int'.
try:
cmd = fcntl.F_NOTIFY
# This flag is larger than 2**31 in 64-bit builds
flags = fcntl.DN_MULTISHOT
except AttributeError:
self.skipTest("F_NOTIFY or DN_MULTISHOT unavailable")
fd = os.open(os.path.dirname(os.path.abspath(TESTFN)), os.O_RDONLY)
try:
fcntl.fcntl(fd, cmd, flags)
finally:
os.close(fd)
def test_main(): def test_main():
run_unittest(TestFcntl) run_unittest(TestFcntl)
......
...@@ -302,6 +302,10 @@ Core and Builtins ...@@ -302,6 +302,10 @@ Core and Builtins
Library Library
------- -------
- Issue #1309352: fcntl now converts its third arguments to a C `long` rather
than an int, which makes some operations possible under 64-bit Linux (e.g.
DN_MULTISHOT with F_NOTIFY).
- Issue #1424152: Fix for httplib, urllib2 to support SSL while working through - Issue #1424152: Fix for httplib, urllib2 to support SSL while working through
proxy. Original patch by Christopher Li, changes made by Senthil Kumaran. proxy. Original patch by Christopher Li, changes made by Senthil Kumaran.
......
...@@ -34,7 +34,7 @@ fcntl_fcntl(PyObject *self, PyObject *args) ...@@ -34,7 +34,7 @@ fcntl_fcntl(PyObject *self, PyObject *args)
{ {
int fd; int fd;
int code; int code;
int arg; long arg;
int ret; int ret;
char *str; char *str;
Py_ssize_t len; Py_ssize_t len;
...@@ -61,7 +61,7 @@ fcntl_fcntl(PyObject *self, PyObject *args) ...@@ -61,7 +61,7 @@ fcntl_fcntl(PyObject *self, PyObject *args)
PyErr_Clear(); PyErr_Clear();
arg = 0; arg = 0;
if (!PyArg_ParseTuple(args, if (!PyArg_ParseTuple(args,
"O&i|i;fcntl requires a file or file descriptor," "O&i|l;fcntl requires a file or file descriptor,"
" an integer and optionally a third integer or a string", " an integer and optionally a third integer or a string",
conv_descriptor, &fd, &code, &arg)) { conv_descriptor, &fd, &code, &arg)) {
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