https://github.com/python/cpython/commit/a126cefc176a7ddbd1a09ce560195f6fd81a5c92 commit: a126cefc176a7ddbd1a09ce560195f6fd81a5c92 branch: main author: Tomas R. <tomas.ro...@gmail.com> committer: picnixz <10796600+picn...@users.noreply.github.com> date: 2025-04-04T13:26:59Z summary:
gh-130655: Add a test for corrupt `.mo` files in `gettext` (#131911) files: M Lib/test/test_gettext.py diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index 87a77aab19336e..d2f18f1dfede77 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -88,6 +88,32 @@ ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA== ''' +# Corrupt .mo file +# Generated from +# +# msgid "foo" +# msgstr "bar" +# +# with msgfmt --no-hash +# +# The translation offset is changed to 0xFFFFFFFF, +# making it larger than the file size, which should +# raise an error when parsing. +GNU_MO_DATA_CORRUPT = base64.b64encode(bytes([ + 0xDE, 0x12, 0x04, 0x95, # Magic + 0x00, 0x00, 0x00, 0x00, # Version + 0x01, 0x00, 0x00, 0x00, # Message count + 0x1C, 0x00, 0x00, 0x00, # Message offset + 0x24, 0x00, 0x00, 0x00, # Translation offset + 0x00, 0x00, 0x00, 0x00, # Hash table size + 0x2C, 0x00, 0x00, 0x00, # Hash table offset + 0x03, 0x00, 0x00, 0x00, # 1st message length + 0x2C, 0x00, 0x00, 0x00, # 1st message offset + 0x03, 0x00, 0x00, 0x00, # 1st trans length + 0xFF, 0xFF, 0xFF, 0xFF, # 1st trans offset (Modified to make it invalid) + 0x66, 0x6F, 0x6F, 0x00, # Message data + 0x62, 0x61, 0x72, 0x00, # Message data +])) UMO_DATA = b'''\ 3hIElQAAAAADAAAAHAAAADQAAAAAAAAAAAAAAAAAAABMAAAABAAAAE0AAAAQAAAAUgAAAA8BAABj @@ -115,6 +141,7 @@ MOFILE_BAD_MAGIC_NUMBER = os.path.join(LOCALEDIR, 'gettext_bad_magic_number.mo') MOFILE_BAD_MAJOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_major_version.mo') MOFILE_BAD_MINOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_minor_version.mo') +MOFILE_CORRUPT = os.path.join(LOCALEDIR, 'gettext_corrupt.mo') UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo') MMOFILE = os.path.join(LOCALEDIR, 'metadata.mo') @@ -139,6 +166,8 @@ def setUpClass(cls): fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MAJOR_VERSION)) with open(MOFILE_BAD_MINOR_VERSION, 'wb') as fp: fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MINOR_VERSION)) + with open(MOFILE_CORRUPT, 'wb') as fp: + fp.write(base64.decodebytes(GNU_MO_DATA_CORRUPT)) with open(UMOFILE, 'wb') as fp: fp.write(base64.decodebytes(UMO_DATA)) with open(MMOFILE, 'wb') as fp: @@ -254,6 +283,16 @@ def test_bad_minor_version(self): # Check that no error is thrown with a bad minor version number gettext.GNUTranslations(fp) + def test_corrupt_file(self): + with open(MOFILE_CORRUPT, 'rb') as fp: + with self.assertRaises(OSError) as cm: + gettext.GNUTranslations(fp) + + exception = cm.exception + self.assertEqual(exception.errno, 0) + self.assertEqual(exception.strerror, "File is corrupt") + self.assertEqual(exception.filename, MOFILE_CORRUPT) + def test_some_translations(self): eq = self.assertEqual # test some translations _______________________________________________ Python-checkins mailing list -- python-checkins@python.org To unsubscribe send an email to python-checkins-le...@python.org https://mail.python.org/mailman3/lists/python-checkins.python.org/ Member address: arch...@mail-archive.com