mirror of
https://github.com/python/cpython.git
synced 2025-11-03 11:23:31 +00:00
Fixed possible leaks in ElementTree parser.
This commit is contained in:
commit
956244bee1
1 changed files with 8 additions and 2 deletions
|
|
@ -2934,8 +2934,10 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
|
||||||
/* attributes */
|
/* attributes */
|
||||||
if (attrib_in[0]) {
|
if (attrib_in[0]) {
|
||||||
attrib = PyDict_New();
|
attrib = PyDict_New();
|
||||||
if (!attrib)
|
if (!attrib) {
|
||||||
|
Py_DECREF(tag);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
while (attrib_in[0] && attrib_in[1]) {
|
while (attrib_in[0] && attrib_in[1]) {
|
||||||
PyObject* key = makeuniversal(self, attrib_in[0]);
|
PyObject* key = makeuniversal(self, attrib_in[0]);
|
||||||
PyObject* value = PyUnicode_DecodeUTF8(attrib_in[1], strlen(attrib_in[1]), "strict");
|
PyObject* value = PyUnicode_DecodeUTF8(attrib_in[1], strlen(attrib_in[1]), "strict");
|
||||||
|
|
@ -2943,6 +2945,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
|
||||||
Py_XDECREF(value);
|
Py_XDECREF(value);
|
||||||
Py_XDECREF(key);
|
Py_XDECREF(key);
|
||||||
Py_DECREF(attrib);
|
Py_DECREF(attrib);
|
||||||
|
Py_DECREF(tag);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ok = PyDict_SetItem(attrib, key, value);
|
ok = PyDict_SetItem(attrib, key, value);
|
||||||
|
|
@ -2950,6 +2953,7 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
|
||||||
Py_DECREF(key);
|
Py_DECREF(key);
|
||||||
if (ok < 0) {
|
if (ok < 0) {
|
||||||
Py_DECREF(attrib);
|
Py_DECREF(attrib);
|
||||||
|
Py_DECREF(tag);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
attrib_in += 2;
|
attrib_in += 2;
|
||||||
|
|
@ -2957,9 +2961,11 @@ expat_start_handler(XMLParserObject* self, const XML_Char* tag_in,
|
||||||
} else {
|
} else {
|
||||||
/* Pass an empty dictionary on */
|
/* Pass an empty dictionary on */
|
||||||
attrib = PyDict_New();
|
attrib = PyDict_New();
|
||||||
if (!attrib)
|
if (!attrib) {
|
||||||
|
Py_DECREF(tag);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (TreeBuilder_CheckExact(self->target)) {
|
if (TreeBuilder_CheckExact(self->target)) {
|
||||||
/* shortcut */
|
/* shortcut */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue