From 8e42a0a0e0358c2004c33e0c7415ca48874df991 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Thu, 8 Nov 2007 18:04:45 +0000 Subject: [PATCH] Fixed bug #1081: file.seek allows float arguments --- Lib/io.py | 2 ++ Lib/test/test_io.py | 4 ++++ Modules/_fileio.c | 4 ++++ 3 files changed, 10 insertions(+) diff --git a/Lib/io.py b/Lib/io.py index c2f5d3ebfaa..d9550ae54a8 100644 --- a/Lib/io.py +++ b/Lib/io.py @@ -694,6 +694,8 @@ class BytesIO(BufferedIOBase): return n def seek(self, pos, whence=0): + if not isinstance(pos, int): + raise TypeError("an integer is required") if whence == 0: self._pos = max(0, pos) elif whence == 1: diff --git a/Lib/test/test_io.py b/Lib/test/test_io.py index 6091e89497a..dace6427cdf 100644 --- a/Lib/test/test_io.py +++ b/Lib/test/test_io.py @@ -95,6 +95,7 @@ class IOTest(unittest.TestCase): self.assertEqual(f.tell(), 13) self.assertEqual(f.truncate(12), 12) self.assertEqual(f.tell(), 13) + self.assertRaises(TypeError, f.seek, 0.0) def read_ops(self, f, buffered=False): data = f.read(5) @@ -116,6 +117,7 @@ class IOTest(unittest.TestCase): self.assertEqual(f.seek(-6, 1), 5) self.assertEqual(f.read(5), b" worl") self.assertEqual(f.tell(), 10) + self.assertRaises(TypeError, f.seek, 0.0) if buffered: f.seek(0) self.assertEqual(f.read(), b"hello world\n") @@ -296,6 +298,7 @@ class MemorySeekTestMixin: bytesIo.seek(3) self.assertEquals(buf[3:], bytesIo.read()) + self.assertRaises(TypeError, bytesIo.seek, 0.0) def testTell(self): buf = self.buftype("1234567890") @@ -481,6 +484,7 @@ class BufferedRandomTest(unittest.TestCase): rw.seek(2, 1) self.assertEquals(7, rw.tell()) self.assertEquals(b"fl", rw.read(11)) + self.assertRaises(TypeError, rw.seek, 0.0) class TextIOWrapperTest(unittest.TestCase): diff --git a/Modules/_fileio.c b/Modules/_fileio.c index c357a73b3bf..0fd8b668571 100644 --- a/Modules/_fileio.c +++ b/Modules/_fileio.c @@ -556,6 +556,10 @@ portable_lseek(int fd, PyObject *posobj, int whence) if (posobj == NULL) pos = 0; else { + if(PyFloat_Check(posobj)) { + PyErr_SetString(PyExc_TypeError, "an integer is required"); + return NULL; + } #if !defined(HAVE_LARGEFILE_SUPPORT) pos = PyInt_AsLong(posobj); #else