--- Modules/_fileio.c.orig 2009-01-21 01:35:06.000000000 +0100 +++ Modules/_fileio.c 2009-01-21 01:35:44.000000000 +0100 @@ -55,6 +55,8 @@ #define PyFileIO_Check(op) (PyObject_TypeCheck((op), &PyFileIO_Type)) +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) @@ -383,14 +385,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); } Index: Lib/test/test_largefile.py =================================================================== --- Lib/test/test_largefile.py (révision 68832) +++ Lib/test/test_largefile.py (copie de travail) @@ -131,6 +131,12 @@ f.seek(0) self.assertEqual(len(f.read()), 1) # else wasn't truncated + def test_seekable(self): + for pos in (2**31-1, 2**31, 2**31+1): + with open(TESTFN, 'rb') as f: + f.seek(pos) + self.assert_(f.seekable()) + def test_main(): # On Windows and Mac OSX this test comsumes large resources; It # takes a long time to build the >2GB file and takes >2GB of disk @@ -162,6 +168,7 @@ suite.addTest(TestCase('test_osstat')) suite.addTest(TestCase('test_seek_read')) suite.addTest(TestCase('test_lseek')) + suite.addTest(TestCase('test_seekable')) with open(TESTFN, 'w') as f: if hasattr(f, 'truncate'): suite.addTest(TestCase('test_truncate'))