Issue #26198: ValueError is now raised instead of TypeError on buffer

overflow in parsing "es#" and "et#" format units.  SystemError is now raised
instead of TypeError on programmical error in parsing format string.
This commit is contained in:
Serhiy Storchaka 2016-02-08 01:22:47 +02:00
parent 3e17c788a8
commit 4cd63ef67a
4 changed files with 20 additions and 8 deletions

View File

@ -488,10 +488,10 @@ class SkipitemTest(unittest.TestCase):
_testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
format.encode("ascii"), keywords)
when_not_skipped = False
except TypeError as e:
except SystemError as e:
s = "argument 1 (impossible<bad format char>)"
when_not_skipped = (str(e) == s)
except RuntimeError as e:
except (TypeError, RuntimeError):
when_not_skipped = False
# test the format unit when skipped

View File

@ -636,10 +636,10 @@ class String_TestCase(unittest.TestCase):
self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
buf = bytearray(b'x'*4)
self.assertRaises(TypeError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
self.assertEqual(buf, bytearray(b'x'*4))
buf = bytearray()
self.assertRaises(TypeError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
self.assertRaises(ValueError, getargs_es_hash, 'abc\xe9', 'latin1', buf)
def test_et_hash(self):
from _testcapi import getargs_et_hash
@ -662,10 +662,10 @@ class String_TestCase(unittest.TestCase):
self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
buf = bytearray(b'x'*4)
self.assertRaises(TypeError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
self.assertEqual(buf, bytearray(b'x'*4))
buf = bytearray()
self.assertRaises(TypeError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
self.assertRaises(ValueError, getargs_et_hash, 'abc\xe9', 'latin1', buf)
def test_u(self):
from _testcapi import getargs_u

View File

@ -713,6 +713,13 @@ Tools/Demos
- Issue #25154: The pyvenv script has been deprecated in favour of
`python3 -m venv`.
C API
-----
- Issue #26198: ValueError is now raised instead of TypeError on buffer
overflow in parsing "es#" and "et#" format units. SystemError is now raised
instead of TypeError on programmical error in parsing format string.
What's New in Python 3.5.1 final?
=================================

View File

@ -394,7 +394,12 @@ seterror(Py_ssize_t iarg, const char *msg, int *levels, const char *fname,
PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
message = buf;
}
PyErr_SetString(PyExc_TypeError, message);
if (msg[0] == '(') {
PyErr_SetString(PyExc_SystemError, message);
}
else {
PyErr_SetString(PyExc_TypeError, message);
}
}
@ -1129,7 +1134,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
} else {
if (size + 1 > BUFFER_LEN) {
Py_DECREF(s);
PyErr_Format(PyExc_TypeError,
PyErr_Format(PyExc_ValueError,
"encoded string too long "
"(%zd, maximum length %zd)",
(Py_ssize_t)size, (Py_ssize_t)(BUFFER_LEN-1));