Issue #25019: Fixed a crash caused by setting non-string key of expat parser.
Added additional tests for expat parser attributes. Based on patch by John Leitch.
This commit is contained in:
commit
3b1bc7828d
|
@ -16,22 +16,47 @@ from test.support import sortdict
|
|||
class SetAttributeTest(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.parser = expat.ParserCreate(namespace_separator='!')
|
||||
self.set_get_pairs = [
|
||||
[0, 0],
|
||||
[1, 1],
|
||||
[2, 1],
|
||||
[0, 0],
|
||||
]
|
||||
|
||||
def test_buffer_text(self):
|
||||
self.assertIs(self.parser.buffer_text, False)
|
||||
for x in 0, 1, 2, 0:
|
||||
self.parser.buffer_text = x
|
||||
self.assertIs(self.parser.buffer_text, bool(x))
|
||||
|
||||
def test_namespace_prefixes(self):
|
||||
self.assertIs(self.parser.namespace_prefixes, False)
|
||||
for x in 0, 1, 2, 0:
|
||||
self.parser.namespace_prefixes = x
|
||||
self.assertIs(self.parser.namespace_prefixes, bool(x))
|
||||
|
||||
def test_ordered_attributes(self):
|
||||
for x, y in self.set_get_pairs:
|
||||
self.assertIs(self.parser.ordered_attributes, False)
|
||||
for x in 0, 1, 2, 0:
|
||||
self.parser.ordered_attributes = x
|
||||
self.assertEqual(self.parser.ordered_attributes, y)
|
||||
self.assertIs(self.parser.ordered_attributes, bool(x))
|
||||
|
||||
def test_specified_attributes(self):
|
||||
for x, y in self.set_get_pairs:
|
||||
self.assertIs(self.parser.specified_attributes, False)
|
||||
for x in 0, 1, 2, 0:
|
||||
self.parser.specified_attributes = x
|
||||
self.assertEqual(self.parser.specified_attributes, y)
|
||||
self.assertIs(self.parser.specified_attributes, bool(x))
|
||||
|
||||
def test_specified_attributes(self):
|
||||
self.assertIs(self.parser.specified_attributes, False)
|
||||
for x in 0, 1, 2, 0:
|
||||
self.parser.specified_attributes = x
|
||||
self.assertIs(self.parser.specified_attributes, bool(x))
|
||||
|
||||
def test_invalid_attributes(self):
|
||||
with self.assertRaises(AttributeError):
|
||||
self.parser.returns_unicode = 1
|
||||
with self.assertRaises(AttributeError):
|
||||
self.parser.returns_unicode
|
||||
|
||||
# Issue #25019
|
||||
self.assertRaises(TypeError, setattr, self.parser, range(0xF), 0)
|
||||
self.assertRaises(TypeError, self.parser.__setattr__, range(0xF), 0)
|
||||
self.assertRaises(TypeError, getattr, self.parser, range(0xF))
|
||||
|
||||
|
||||
data = b'''\
|
||||
|
@ -514,11 +539,12 @@ class ChardataBufferTest(unittest.TestCase):
|
|||
def test_wrong_size(self):
|
||||
parser = expat.ParserCreate()
|
||||
parser.buffer_text = 1
|
||||
def f(size):
|
||||
parser.buffer_size = size
|
||||
|
||||
self.assertRaises(ValueError, f, -1)
|
||||
self.assertRaises(ValueError, f, 0)
|
||||
with self.assertRaises(ValueError):
|
||||
parser.buffer_size = -1
|
||||
with self.assertRaises(ValueError):
|
||||
parser.buffer_size = 0
|
||||
with self.assertRaises(TypeError):
|
||||
parser.buffer_size = 512.0
|
||||
|
||||
def test_unchanged_size(self):
|
||||
xml1 = b"<?xml version='1.0' encoding='iso8859'?><s>" + b'a' * 512
|
||||
|
|
|
@ -831,6 +831,7 @@ Joerg Lehmann
|
|||
Robert Lehmann
|
||||
Petri Lehtinen
|
||||
Luke Kenneth Casson Leighton
|
||||
John Leitch
|
||||
Tshepang Lekhonkhobe
|
||||
Marc-André Lemburg
|
||||
Mateusz Lenik
|
||||
|
|
|
@ -14,6 +14,9 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #25019: Fixed a crash caused by setting non-string key of expat parser.
|
||||
Based on patch by John Leitch.
|
||||
|
||||
- Issue #16180: Exit pdb if file has syntax error, instead of trapping user
|
||||
in an infinite loop. Patch by Xavier de Gaye.
|
||||
|
||||
|
|
|
@ -1378,11 +1378,16 @@ static int
|
|||
xmlparse_setattro(xmlparseobject *self, PyObject *name, PyObject *v)
|
||||
{
|
||||
/* Set attribute 'name' to value 'v'. v==NULL means delete */
|
||||
if (!PyUnicode_Check(name)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"attribute name must be string, not '%.200s'",
|
||||
name->ob_type->tp_name);
|
||||
return -1;
|
||||
}
|
||||
if (v == NULL) {
|
||||
PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute");
|
||||
return -1;
|
||||
}
|
||||
assert(PyUnicode_Check(name));
|
||||
if (PyUnicode_CompareWithASCIIString(name, "buffer_text") == 0) {
|
||||
int b = PyObject_IsTrue(v);
|
||||
if (b < 0)
|
||||
|
|
Loading…
Reference in New Issue