diff --git a/mwparserfromhell/parser/tokenizer.c b/mwparserfromhell/parser/tokenizer.c index 121ccc9..cc1b4dd 100644 --- a/mwparserfromhell/parser/tokenizer.c +++ b/mwparserfromhell/parser/tokenizer.c @@ -1163,7 +1163,7 @@ Tokenizer_verify_safe(Tokenizer* self, int context, Py_UNICODE data) else if (context & (LC_TEMPLATE_PARAM_KEY | LC_ARGUMENT_NAME)) { if (context & LC_FAIL_ON_EQUALS) { if (data == *"=") { - self->topstack->context |= LC_FAIL_NEXT; + Tokenizer_fail_route(self); return; } } @@ -1195,7 +1195,12 @@ Tokenizer_verify_safe(Tokenizer* self, int context, Py_UNICODE data) if (context & LC_HAS_TEXT) { if (context & LC_FAIL_ON_TEXT) { if (!Py_UNICODE_ISSPACE(data)) { - Tokenizer_fail_route(self); + if (context & LC_TEMPLATE_PARAM_KEY) { + self->topstack->context ^= LC_FAIL_ON_TEXT; + self->topstack->context |= LC_FAIL_ON_EQUALS; + } + else + Tokenizer_fail_route(self); return; } } @@ -1220,6 +1225,7 @@ Tokenizer_parse(Tokenizer* self, int context) LC_TEMPLATE_PARAM_KEY | LC_ARGUMENT_NAME); int this_context, is_marker, i; Py_UNICODE this, next, next_next, last; + PyObject *trash; if (Tokenizer_push(self, context)) return NULL; @@ -1228,8 +1234,13 @@ Tokenizer_parse(Tokenizer* self, int context) this_context = self->topstack->context; if (this_context & unsafe_contexts) { Tokenizer_verify_safe(self, this_context, this); - if (BAD_ROUTE) + if (BAD_ROUTE) { + if (this_context & LC_TEMPLATE_PARAM_KEY) { + trash = Tokenizer_pop(self); + Py_XDECREF(trash); + } return NULL; + } } is_marker = 0; for (i = 0; i < NUM_MARKERS; i++) { @@ -1245,7 +1256,7 @@ Tokenizer_parse(Tokenizer* self, int context) } if (this == *"") { if (this_context & LC_TEMPLATE_PARAM_KEY) { - PyObject* trash = Tokenizer_pop(self); + trash = Tokenizer_pop(self); Py_XDECREF(trash); } if (this_context & fail_contexts)