summaryrefslogtreecommitdiff
path: root/Modules
diff options
context:
space:
mode:
authorscoder <stefan_ml@behnel.de>2018-03-24 06:56:41 +0100
committerSerhiy Storchaka <storchaka@gmail.com>2018-03-24 07:56:41 +0200
commit0694b6a651ba2a53f6323ffb3b23358f43885815 (patch)
tree48b05b1290adfc361e50f99382b0f451fd9b2a40 /Modules
parent1ce4e5bee6df476836f799456f2caf77cd13dc97 (diff)
downloadcpython-git-0694b6a651ba2a53f6323ffb3b23358f43885815.tar.gz
bpo-31544: Avoid calling "PyObject_GetAttrString()" (and potentially executing user code) with a live exception set. (GH-3992)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/_elementtree.c35
1 files changed, 33 insertions, 2 deletions
diff --git a/Modules/_elementtree.c b/Modules/_elementtree.c
index 574559c631..7f0e609340 100644
--- a/Modules/_elementtree.c
+++ b/Modules/_elementtree.c
@@ -2510,6 +2510,18 @@ expat_unknown_encoding_handler(XMLParserObject *self, const XML_Char *name,
/* -------------------------------------------------------------------- */
/* constructor and destructor */
+static int
+ignore_attribute_error(PyObject *value)
+{
+ if (value == NULL) {
+ if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
+ return -1;
+ }
+ PyErr_Clear();
+ }
+ return 0;
+}
+
static PyObject*
xmlparser(PyObject* self_, PyObject* args, PyObject* kw)
{
@@ -2578,14 +2590,33 @@ xmlparser(PyObject* self_, PyObject* args, PyObject* kw)
self->target = target;
self->handle_xml = PyObject_GetAttrString(target, "xml");
+ if (ignore_attribute_error(self->handle_xml)) {
+ return NULL;
+ }
self->handle_start = PyObject_GetAttrString(target, "start");
+ if (ignore_attribute_error(self->handle_start)) {
+ return NULL;
+ }
self->handle_data = PyObject_GetAttrString(target, "data");
+ if (ignore_attribute_error(self->handle_data)) {
+ return NULL;
+ }
self->handle_end = PyObject_GetAttrString(target, "end");
+ if (ignore_attribute_error(self->handle_end)) {
+ return NULL;
+ }
self->handle_comment = PyObject_GetAttrString(target, "comment");
+ if (ignore_attribute_error(self->handle_comment)) {
+ return NULL;
+ }
self->handle_pi = PyObject_GetAttrString(target, "pi");
+ if (ignore_attribute_error(self->handle_pi)) {
+ return NULL;
+ }
self->handle_close = PyObject_GetAttrString(target, "close");
-
- PyErr_Clear();
+ if (ignore_attribute_error(self->handle_close)) {
+ return NULL;
+ }
/* configure parser */
EXPAT(SetUserData)(self->parser, self);