summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin v. Löwis <martin@v.loewis.de>2006-11-19 10:41:41 (GMT)
committerMartin v. Löwis <martin@v.loewis.de>2006-11-19 10:41:41 (GMT)
commitcffcc8b195d0086d6089ac4563ac17b4c95471e3 (patch)
tree0e082ae41d65af0c069a5df47c70354827ddb830
parent283a1353a0834d53b230b22e8db9e7b4fcd220d0 (diff)
downloadcpython-cffcc8b195d0086d6089ac4563ac17b4c95471e3.zip
cpython-cffcc8b195d0086d6089ac4563ac17b4c95471e3.tar.gz
cpython-cffcc8b195d0086d6089ac4563ac17b4c95471e3.tar.bz2
Make cStringIO.truncate raise IOError for negative
arguments (even for -1). Fixes the last bit of #1359365.
-rw-r--r--Lib/test/test_StringIO.py1
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/cStringIO.c12
3 files changed, 15 insertions, 1 deletions
diff --git a/Lib/test/test_StringIO.py b/Lib/test/test_StringIO.py
index aa36b09..9f79b02 100644
--- a/Lib/test/test_StringIO.py
+++ b/Lib/test/test_StringIO.py
@@ -62,6 +62,7 @@ class TestGenericStringIO(unittest.TestCase):
eq(f.getvalue(), 'abcde')
f.write('xyz')
eq(f.getvalue(), 'abcdexyz')
+ self.assertRaises(IOError, f.truncate, -1)
f.close()
self.assertRaises(ValueError, f.write, 'frobnitz')
diff --git a/Misc/NEWS b/Misc/NEWS
index 6fd73f6..9b2aeba 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -101,6 +101,9 @@ Core and builtins
Library
-------
+- cStringIO.truncate(-1) now raises an IOError, like StringIO and
+ regular files.
+
- Patch #1472877: Fix Tix subwidget name resolution.
- Patch #1594554: Always close a tkSimpleDialog on ok(), even
diff --git a/Modules/cStringIO.c b/Modules/cStringIO.c
index 100891b..3f762b0 100644
--- a/Modules/cStringIO.c
+++ b/Modules/cStringIO.c
@@ -289,7 +289,17 @@ IO_truncate(IOobject *self, PyObject *args) {
if (!IO__opencheck(self)) return NULL;
if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;
- if (pos < 0) pos = self->pos;
+
+ if (PyTuple_Size(args) == 0) {
+ /* No argument passed, truncate to current position */
+ pos = self->pos;
+ }
+
+ if (pos < 0) {
+ errno = EINVAL;
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
if (self->string_size > pos) self->string_size = pos;
self->pos = self->string_size;