Issue #5016: FileIO.seekable() could return False if the file position
was negative when truncated to a C int. Patch by Victor Stinner.
diff --git a/Modules/_fileio.c b/Modules/_fileio.c
index 32f6790..88ee54c 100644
--- a/Modules/_fileio.c
+++ b/Modules/_fileio.c
@@ -66,6 +66,8 @@
static PyObject *
portable_lseek(int fd, PyObject *posobj, int whence);
+static PyObject *portable_lseek(int fd, PyObject *posobj, int whence);
+
/* Returns 0 on success, -1 with exception set on failure. */
static int
internal_close(PyFileIOObject *self)
@@ -441,14 +443,14 @@
if (self->fd < 0)
return err_closed();
if (self->seekable < 0) {
- int ret;
- Py_BEGIN_ALLOW_THREADS
- ret = lseek(self->fd, 0, SEEK_CUR);
- Py_END_ALLOW_THREADS
- if (ret < 0)
+ PyObject *pos = portable_lseek(self->fd, NULL, SEEK_CUR);
+ if (pos == NULL) {
+ PyErr_Clear();
self->seekable = 0;
- else
+ } else {
+ Py_DECREF(pos);
self->seekable = 1;
+ }
}
return PyBool_FromLong((long) self->seekable);
}