diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-07-18 21:17:01 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-07-18 21:17:01 (GMT) |
commit | 9e09c26e8a5af10609f1e470ae736f4f24bf46b7 (patch) | |
tree | 0761b83333b01bead6b57242c812213a6e25c753 /Modules/pyexpat.c | |
parent | 3fd8cbd5e41db932e1b7d503673a7c662a98d331 (diff) | |
download | cpython-9e09c26e8a5af10609f1e470ae736f4f24bf46b7.zip cpython-9e09c26e8a5af10609f1e470ae736f4f24bf46b7.tar.gz cpython-9e09c26e8a5af10609f1e470ae736f4f24bf46b7.tar.bz2 |
Issue #18501, #18408: Fix expat handlers in pyexpat, don't call Python
functions if a Python exception was raised
Diffstat (limited to 'Modules/pyexpat.c')
-rw-r--r-- | Modules/pyexpat.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/Modules/pyexpat.c b/Modules/pyexpat.c index 8c9a07b..82d9d6a 100644 --- a/Modules/pyexpat.c +++ b/Modules/pyexpat.c @@ -402,6 +402,10 @@ static void my_CharacterDataHandler(void *userData, const XML_Char *data, int len) { xmlparseobject *self = (xmlparseobject *) userData; + + if (PyErr_Occurred()) + return; + if (self->buffer == NULL) call_character_handler(self, data, len); else { @@ -436,6 +440,9 @@ my_StartElementHandler(void *userData, PyObject *container, *rv, *args; int i, max; + if (PyErr_Occurred()) + return; + if (flush_character_buffer(self) < 0) return; /* Set max to the number of slots filled in atts[]; max/2 is @@ -519,6 +526,8 @@ my_##NAME##Handler PARAMS {\ INIT \ \ if (have_handler(self, NAME)) { \ + if (PyErr_Occurred()) \ + return RETURN; \ if (flush_character_buffer(self) < 0) \ return RETURN; \ args = Py_BuildValue PARAM_FORMAT ;\ @@ -633,6 +642,9 @@ my_ElementDeclHandler(void *userData, PyObject *rv = NULL; PyObject *modelobj, *nameobj; + if (PyErr_Occurred()) + return; + if (flush_character_buffer(self) < 0) goto finally; modelobj = conv_content_model(model, (conv_string_to_unicode)); @@ -1125,6 +1137,9 @@ PyUnknownEncodingHandler(void *encodingHandlerData, void *data; unsigned int kind; + if (PyErr_Occurred()) + return XML_STATUS_ERROR; + if (template_buffer[1] == 0) { for (i = 0; i < 256; i++) template_buffer[i] = i; |