Commit 4cd63ef6 authored by Serhiy Storchaka's avatar Serhiy Storchaka

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.
parent 3e17c788
...@@ -488,10 +488,10 @@ class SkipitemTest(unittest.TestCase): ...@@ -488,10 +488,10 @@ class SkipitemTest(unittest.TestCase):
_testcapi.parse_tuple_and_keywords(tuple_1, dict_b, _testcapi.parse_tuple_and_keywords(tuple_1, dict_b,
format.encode("ascii"), keywords) format.encode("ascii"), keywords)
when_not_skipped = False when_not_skipped = False
except TypeError as e: except SystemError as e:
s = "argument 1 (impossible<bad format char>)" s = "argument 1 (impossible<bad format char>)"
when_not_skipped = (str(e) == s) when_not_skipped = (str(e) == s)
except RuntimeError as e: except (TypeError, RuntimeError):
when_not_skipped = False when_not_skipped = False
# test the format unit when skipped # test the format unit when skipped
......
...@@ -636,10 +636,10 @@ class String_TestCase(unittest.TestCase): ...@@ -636,10 +636,10 @@ class String_TestCase(unittest.TestCase):
self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9') self.assertEqual(getargs_es_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
self.assertEqual(buf, bytearray(b'abc\xe9\x00')) self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
buf = bytearray(b'x'*4) 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)) self.assertEqual(buf, bytearray(b'x'*4))
buf = bytearray() 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): def test_et_hash(self):
from _testcapi import getargs_et_hash from _testcapi import getargs_et_hash
...@@ -662,10 +662,10 @@ class String_TestCase(unittest.TestCase): ...@@ -662,10 +662,10 @@ class String_TestCase(unittest.TestCase):
self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9') self.assertEqual(getargs_et_hash('abc\xe9', 'latin1', buf), b'abc\xe9')
self.assertEqual(buf, bytearray(b'abc\xe9\x00')) self.assertEqual(buf, bytearray(b'abc\xe9\x00'))
buf = bytearray(b'x'*4) 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)) self.assertEqual(buf, bytearray(b'x'*4))
buf = bytearray() 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): def test_u(self):
from _testcapi import getargs_u from _testcapi import getargs_u
......
...@@ -713,6 +713,13 @@ Tools/Demos ...@@ -713,6 +713,13 @@ Tools/Demos
- Issue #25154: The pyvenv script has been deprecated in favour of - Issue #25154: The pyvenv script has been deprecated in favour of
`python3 -m venv`. `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? What's New in Python 3.5.1 final?
================================= =================================
......
...@@ -394,7 +394,12 @@ seterror(Py_ssize_t iarg, const char *msg, int *levels, const char *fname, ...@@ -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); PyOS_snprintf(p, sizeof(buf) - (p - buf), " %.256s", msg);
message = buf; 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, ...@@ -1129,7 +1134,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags,
} else { } else {
if (size + 1 > BUFFER_LEN) { if (size + 1 > BUFFER_LEN) {
Py_DECREF(s); Py_DECREF(s);
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_ValueError,
"encoded string too long " "encoded string too long "
"(%zd, maximum length %zd)", "(%zd, maximum length %zd)",
(Py_ssize_t)size, (Py_ssize_t)(BUFFER_LEN-1)); (Py_ssize_t)size, (Py_ssize_t)(BUFFER_LEN-1));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment