From 8e596a765cf323cbd2ba31b15f2939f903d87913 Mon Sep 17 00:00:00 2001 From: Ezio Melotti Date: Wed, 1 May 2013 16:18:25 +0300 Subject: [PATCH] #17802: Fix an UnboundLocalError in html.parser. Initial tests by Thomas Barlow. --- Lib/html/parser.py | 1 + Lib/test/test_htmlparser.py | 14 ++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 18 insertions(+) diff --git a/Lib/html/parser.py b/Lib/html/parser.py index f8ac82834a3..60a322a9494 100644 --- a/Lib/html/parser.py +++ b/Lib/html/parser.py @@ -249,6 +249,7 @@ class HTMLParser(_markupbase.ParserBase): if self.strict: self.error("EOF in middle of entity or char ref") else: + k = match.end() if k <= i: k = n i = self.updatepos(i, i + 1) diff --git a/Lib/test/test_htmlparser.py b/Lib/test/test_htmlparser.py index c5d878dca59..b15b6fd4c6c 100644 --- a/Lib/test/test_htmlparser.py +++ b/Lib/test/test_htmlparser.py @@ -535,6 +535,20 @@ class HTMLParserTolerantTestCase(HTMLParserStrictTestCase): ] self._run_check(html, expected) + def test_EOF_in_charref(self): + # see #17802 + # This test checks that the UnboundLocalError reported in the issue + # is not raised, however I'm not sure the returned values are correct. + # Maybe HTMLParser should use self.unescape for these + data = [ + ('a&', [('data', 'a&')]), + ('a&b', [('data', 'ab')]), + ('a&b ', [('data', 'a'), ('entityref', 'b'), ('data', ' ')]), + ('a&b;', [('data', 'a'), ('entityref', 'b')]), + ] + for html, expected in data: + self._run_check(html, expected) + def test_unescape_function(self): p = self.get_collector() self.assertEqual(p.unescape('&#bad;'),'&#bad;') diff --git a/Misc/NEWS b/Misc/NEWS index 10f00a466c1..465ca10ff01 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -44,6 +44,9 @@ Core and Builtins Library ------- +- Issue #17802: Fix an UnboundLocalError in html.parser. Initial tests by + Thomas Barlow. + - Issue #17192: Restore the patch for Issue #11729 which was ommitted in 3.3.1 when updating the bundled version of libffi used by ctypes. Update many libffi files that were missed in 3.3.1's update to libffi-3.0.13.