Fixed bug #1081: file.seek allows float arguments

This commit is contained in:
Christian Heimes 2007-11-08 18:04:45 +00:00
parent 8bd14fb398
commit 8e42a0a0e0
3 changed files with 10 additions and 0 deletions

View file

@ -694,6 +694,8 @@ class BytesIO(BufferedIOBase):
return n return n
def seek(self, pos, whence=0): def seek(self, pos, whence=0):
if not isinstance(pos, int):
raise TypeError("an integer is required")
if whence == 0: if whence == 0:
self._pos = max(0, pos) self._pos = max(0, pos)
elif whence == 1: elif whence == 1:

View file

@ -95,6 +95,7 @@ class IOTest(unittest.TestCase):
self.assertEqual(f.tell(), 13) self.assertEqual(f.tell(), 13)
self.assertEqual(f.truncate(12), 12) self.assertEqual(f.truncate(12), 12)
self.assertEqual(f.tell(), 13) self.assertEqual(f.tell(), 13)
self.assertRaises(TypeError, f.seek, 0.0)
def read_ops(self, f, buffered=False): def read_ops(self, f, buffered=False):
data = f.read(5) data = f.read(5)
@ -116,6 +117,7 @@ class IOTest(unittest.TestCase):
self.assertEqual(f.seek(-6, 1), 5) self.assertEqual(f.seek(-6, 1), 5)
self.assertEqual(f.read(5), b" worl") self.assertEqual(f.read(5), b" worl")
self.assertEqual(f.tell(), 10) self.assertEqual(f.tell(), 10)
self.assertRaises(TypeError, f.seek, 0.0)
if buffered: if buffered:
f.seek(0) f.seek(0)
self.assertEqual(f.read(), b"hello world\n") self.assertEqual(f.read(), b"hello world\n")
@ -296,6 +298,7 @@ class MemorySeekTestMixin:
bytesIo.seek(3) bytesIo.seek(3)
self.assertEquals(buf[3:], bytesIo.read()) self.assertEquals(buf[3:], bytesIo.read())
self.assertRaises(TypeError, bytesIo.seek, 0.0)
def testTell(self): def testTell(self):
buf = self.buftype("1234567890") buf = self.buftype("1234567890")
@ -481,6 +484,7 @@ class BufferedRandomTest(unittest.TestCase):
rw.seek(2, 1) rw.seek(2, 1)
self.assertEquals(7, rw.tell()) self.assertEquals(7, rw.tell())
self.assertEquals(b"fl", rw.read(11)) self.assertEquals(b"fl", rw.read(11))
self.assertRaises(TypeError, rw.seek, 0.0)
class TextIOWrapperTest(unittest.TestCase): class TextIOWrapperTest(unittest.TestCase):

View file

@ -556,6 +556,10 @@ portable_lseek(int fd, PyObject *posobj, int whence)
if (posobj == NULL) if (posobj == NULL)
pos = 0; pos = 0;
else { else {
if(PyFloat_Check(posobj)) {
PyErr_SetString(PyExc_TypeError, "an integer is required");
return NULL;
}
#if !defined(HAVE_LARGEFILE_SUPPORT) #if !defined(HAVE_LARGEFILE_SUPPORT)
pos = PyInt_AsLong(posobj); pos = PyInt_AsLong(posobj);
#else #else