Skip to content

Commit d8986b7

Browse files
[3.13] gh-130655: Add a test for corrupt .mo files in gettext (GH-131911) (#132079)
gh-130655: Add a test for corrupt `.mo` files in `gettext` (GH-131911) (cherry picked from commit a126cef) Co-authored-by: Tomas R <tomas.roun8@gmail.com>
1 parent 2c05ebd commit d8986b7

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

Lib/test/test_gettext.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,32 @@
9090
ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
9191
'''
9292

93+
# Corrupt .mo file
94+
# Generated from
95+
#
96+
# msgid "foo"
97+
# msgstr "bar"
98+
#
99+
# with msgfmt --no-hash
100+
#
101+
# The translation offset is changed to 0xFFFFFFFF,
102+
# making it larger than the file size, which should
103+
# raise an error when parsing.
104+
GNU_MO_DATA_CORRUPT = base64.b64encode(bytes([
105+
0xDE, 0x12, 0x04, 0x95, # Magic
106+
0x00, 0x00, 0x00, 0x00, # Version
107+
0x01, 0x00, 0x00, 0x00, # Message count
108+
0x1C, 0x00, 0x00, 0x00, # Message offset
109+
0x24, 0x00, 0x00, 0x00, # Translation offset
110+
0x00, 0x00, 0x00, 0x00, # Hash table size
111+
0x2C, 0x00, 0x00, 0x00, # Hash table offset
112+
0x03, 0x00, 0x00, 0x00, # 1st message length
113+
0x2C, 0x00, 0x00, 0x00, # 1st message offset
114+
0x03, 0x00, 0x00, 0x00, # 1st trans length
115+
0xFF, 0xFF, 0xFF, 0xFF, # 1st trans offset (Modified to make it invalid)
116+
0x66, 0x6F, 0x6F, 0x00, # Message data
117+
0x62, 0x61, 0x72, 0x00, # Message data
118+
]))
93119

94120
UMO_DATA = b'''\
95121
3hIElQAAAAADAAAAHAAAADQAAAAAAAAAAAAAAAAAAABMAAAABAAAAE0AAAAQAAAAUgAAAA8BAABj
@@ -117,6 +143,7 @@
117143
MOFILE_BAD_MAGIC_NUMBER = os.path.join(LOCALEDIR, 'gettext_bad_magic_number.mo')
118144
MOFILE_BAD_MAJOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_major_version.mo')
119145
MOFILE_BAD_MINOR_VERSION = os.path.join(LOCALEDIR, 'gettext_bad_minor_version.mo')
146+
MOFILE_CORRUPT = os.path.join(LOCALEDIR, 'gettext_corrupt.mo')
120147
UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
121148
MMOFILE = os.path.join(LOCALEDIR, 'metadata.mo')
122149

@@ -141,6 +168,8 @@ def setUpClass(cls):
141168
fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MAJOR_VERSION))
142169
with open(MOFILE_BAD_MINOR_VERSION, 'wb') as fp:
143170
fp.write(base64.decodebytes(GNU_MO_DATA_BAD_MINOR_VERSION))
171+
with open(MOFILE_CORRUPT, 'wb') as fp:
172+
fp.write(base64.decodebytes(GNU_MO_DATA_CORRUPT))
144173
with open(UMOFILE, 'wb') as fp:
145174
fp.write(base64.decodebytes(UMO_DATA))
146175
with open(MMOFILE, 'wb') as fp:
@@ -280,6 +309,16 @@ def test_bad_minor_version(self):
280309
# Check that no error is thrown with a bad minor version number
281310
gettext.GNUTranslations(fp)
282311

312+
def test_corrupt_file(self):
313+
with open(MOFILE_CORRUPT, 'rb') as fp:
314+
with self.assertRaises(OSError) as cm:
315+
gettext.GNUTranslations(fp)
316+
317+
exception = cm.exception
318+
self.assertEqual(exception.errno, 0)
319+
self.assertEqual(exception.strerror, "File is corrupt")
320+
self.assertEqual(exception.filename, MOFILE_CORRUPT)
321+
283322
def test_some_translations(self):
284323
eq = self.assertEqual
285324
# test some translations

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy