From 2acdeb77d9d55149b68a9f7ab3bd5c5e34a5f698 Mon Sep 17 00:00:00 2001 From: Philipp Wolfer Date: Tue, 4 May 2021 23:43:10 +0200 Subject: [PATCH] PICARD-2204: Handle EOF when reading "\u" --- picard/script/parser.py | 10 ++++++---- test/test_script.py | 4 +++- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/picard/script/parser.py b/picard/script/parser.py index 6ae132bc0..bc66aedb1 100644 --- a/picard/script/parser.py +++ b/picard/script/parser.py @@ -250,6 +250,8 @@ Grammar: def read_multi(self, count): text = ch = self.read() + if not ch: + self.__raise_eof() count -= 1 while ch and count: ch = self.read() @@ -314,11 +316,11 @@ Grammar: elif ch == 't': text.append('\t') elif ch == 'u': - hex = self.read_multi(4) + codepoint = self.read_multi(4) try: - text.append(chr(int(hex, 16))) - except ValueError: - self.__raise_unicode(hex) + text.append(chr(int(codepoint, 16))) + except (TypeError, ValueError): + self.__raise_unicode(codepoint) elif ch not in "$%(),\\": self.__raise_char(ch) else: diff --git a/test/test_script.py b/test/test_script.py index e8c690cf7..392b0d941 100644 --- a/test/test_script.py +++ b/test/test_script.py @@ -161,7 +161,9 @@ class ScriptParserTest(PicardTestCase): def test_script_unicode_char_eof(self): areg = r"^\d+:\d+: Unexpected end of script" with self.assertRaisesRegex(ScriptEndOfFile, areg): - self.parser.eval("\\uaf") + self.parser.eval("\\u") + with self.assertRaisesRegex(ScriptEndOfFile, areg): + self.parser.eval("\\uaff") def test_script_unicode_char_err(self): areg = r"^\d+:\d+: Invalid unicode character '\\ufffg'"