diff -r c8212fca8747 Modules/_io/fileio.c --- a/Modules/_io/fileio.c Wed Jun 05 02:07:46 2013 +0200 +++ b/Modules/_io/fileio.c Thu Jun 06 22:06:13 2013 +0200 @@ -833,27 +833,39 @@ portable_lseek(int fd, PyObject *posobj, #else pos = PyLong_AsLong(posobj); #endif - if (PyErr_Occurred()) - return NULL; + if (PyErr_Occurred()) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); +#if defined(HAVE_LARGEFILE_SUPPORT) + pos = PyLong_AsUnsignedLongLong(posobj); +#else + pos = PyLong_AsUnsignedLong(posobj); +#endif + if (PyErr_Occurred()) + return NULL; + } } - if (_PyVerify_fd(fd)) { - Py_BEGIN_ALLOW_THREADS + if (!_PyVerify_fd(fd)) { + return PyErr_SetFromErrno(PyExc_IOError); + } + + errno = 0; + Py_BEGIN_ALLOW_THREADS #if defined(MS_WIN64) || defined(MS_WINDOWS) - res = _lseeki64(fd, pos, whence); + res = _lseeki64(fd, pos, whence); #else - res = lseek(fd, pos, whence); + res = lseek(fd, pos, whence); #endif - Py_END_ALLOW_THREADS - } else - res = -1; - if (res < 0) + Py_END_ALLOW_THREADS + if (res == (off_t)-1 && errno) return PyErr_SetFromErrno(PyExc_IOError); #if defined(HAVE_LARGEFILE_SUPPORT) - return PyLong_FromLongLong(res); + return PyLong_FromUnsignedLongLong(res); #else - return PyLong_FromLong(res); + return PyLong_FromUnsignedLong(res); #endif } diff -r c8212fca8747 Modules/posixmodule.c --- a/Modules/posixmodule.c Wed Jun 05 02:07:46 2013 +0200 +++ b/Modules/posixmodule.c Thu Jun 06 22:06:13 2013 +0200 @@ -7438,6 +7438,7 @@ posix_lseek(PyObject *self, PyObject *ar off_t pos, res; #endif PyObject *posobj; + if (!PyArg_ParseTuple(args, "iOi:lseek", &fd, &posobj, &how)) return NULL; #ifdef SEEK_SET @@ -7449,16 +7450,28 @@ posix_lseek(PyObject *self, PyObject *ar } #endif /* SEEK_END */ -#if !defined(HAVE_LARGEFILE_SUPPORT) +#if defined(HAVE_LARGEFILE_SUPPORT) + pos = PyLong_AsLongLong(posobj); +#else pos = PyLong_AsLong(posobj); -#else - pos = PyLong_AsLongLong(posobj); -#endif - if (PyErr_Occurred()) - return NULL; +#endif + if (PyErr_Occurred()) { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); +#if defined(HAVE_LARGEFILE_SUPPORT) + pos = PyLong_AsUnsignedLongLong(posobj); +#else + pos = PyLong_AsUnsignedLong(posobj); +#endif + if (PyErr_Occurred()) + return NULL; + } if (!_PyVerify_fd(fd)) return posix_error(); + + errno = 0; Py_BEGIN_ALLOW_THREADS #if defined(MS_WIN64) || defined(MS_WINDOWS) res = _lseeki64(fd, pos, how); @@ -7466,13 +7479,14 @@ posix_lseek(PyObject *self, PyObject *ar res = lseek(fd, pos, how); #endif Py_END_ALLOW_THREADS - if (res < 0) + + if (res == (off_t)-1 && errno) return posix_error(); #if !defined(HAVE_LARGEFILE_SUPPORT) - return PyLong_FromLong(res); -#else - return PyLong_FromLongLong(res); + return PyLong_FromUnsignedLong(res); +#else + return PyLong_FromUnsignedLongLong(res); #endif }