1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
From: =?utf-8?b?TWljaGFsIMSMaWhhxZk=?= <michal@cihar.com>
Date: Tue, 16 Sep 2025 15:00:09 +0200
Subject: fix(mo): corrected parsing of version
The real-life MO files have version = 0, but based on the specification
only the major version changes should break parsing.
Fixes #3072
---
tests/translate/storage/test_mo.py | 8 ++++++++
translate/storage/mo.py | 10 ++++------
2 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/tests/translate/storage/test_mo.py b/tests/translate/storage/test_mo.py
index 3bbcb2e..8d2729e 100644
--- a/tests/translate/storage/test_mo.py
+++ b/tests/translate/storage/test_mo.py
@@ -8,6 +8,9 @@ from translate.tools import pocompile
from . import test_base
+MO_BIG_ENDIAN = b"\x95\x04\x12\xde\x00\x00\x00\x2a\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00,\x00\x00\x00\x05\x00\x00\x00<\x00\x00\x00\x06\x00\x00\x00P\x00\x00\x00\x07\x00\x00\x00W\x00\x00\x00\x03\x00\x00\x00_\x00\x00\x00\x06\x00\x00\x00c\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02simple\x00unicode\x00Een\x00\xe2\x80\xa0wee\x00"
+MO_LITTLE_ENDIAN = b"\xde\x12\x04\x95\x2a\x00\x00\x00\x02\x00\x00\x00\x1c\x00\x00\x00,\x00\x00\x00\x05\x00\x00\x00<\x00\x00\x00\x06\x00\x00\x00P\x00\x00\x00\x07\x00\x00\x00W\x00\x00\x00\x03\x00\x00\x00_\x00\x00\x00\x06\x00\x00\x00c\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00simple\x00unicode\x00Een\x00\xe2\x80\xa0wee\x00"
+
class TestMOUnit(test_base.TestTranslationUnit):
UnitClass = mo.mounit
@@ -575,3 +578,8 @@ class TestMOFile(test_base.TestTranslationStore):
# Verify parsing of generated files
self.StoreClass.parsefile(MO_POCOMPILE)
self.StoreClass.parsefile(MO_MSGFMT)
+
+ def test_endian_version_parsing(self) -> None:
+ store_big = self.StoreClass(MO_BIG_ENDIAN)
+ store_little = self.StoreClass(MO_LITTLE_ENDIAN)
+ assert store_big.units == store_little.units
diff --git a/translate/storage/mo.py b/translate/storage/mo.py
index 22dea26..474361d 100644
--- a/translate/storage/mo.py
+++ b/translate/storage/mo.py
@@ -252,19 +252,17 @@ class mofile(poheader.poheader, base.TranslationStore):
else:
raise ValueError("This is not an MO file")
(
- _magic,
- version_maj,
- version_min,
+ version,
lenkeys,
startkey,
startvalue,
sizehash,
offsethash,
- ) = struct.unpack(f"{endian}LHHiiiii", content[: (7 * 4)])
+ ) = struct.unpack(f"{endian}iiiiii", content[4 : (7 * 4)])
return (
endian,
- version_maj,
- version_min,
+ version >> 16,
+ version & 0xFF,
lenkeys,
startkey,
startvalue,
|