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);
 }