]> granicus.if.org Git - python/commitdiff
GNUTranslations._parse(): Fix portability problems on 64-bit machines
authorBarry Warsaw <barry@python.org>
Thu, 31 Aug 2000 23:28:52 +0000 (23:28 +0000)
committerBarry Warsaw <barry@python.org>
Thu, 31 Aug 2000 23:28:52 +0000 (23:28 +0000)
by masking all unsigned integers with 0xffffffff.

Lib/gettext.py

index c2a549ff689360268c0daa4aa5740f998e4c963d..f5190a3ba65a5b9d5bdb9409f0b945ce1e2d5f95 100644 (file)
@@ -129,14 +129,18 @@ class GNUTranslations(NullTranslations):
 
     def _parse(self, fp):
         """Override this method to support alternative .mo formats."""
+        # We need to & all 32 bit unsigned integers with 0xffffff for
+        # portability to 64 bit machines.
+        MASK = 0xffffffff
         unpack = struct.unpack
         filename = getattr(fp, 'name', '')
         # Parse the .mo file header, which consists of 5 little endian 32
         # bit words.
         self._catalog = catalog = {}
         buf = fp.read()
+        buflen = len(buf)
         # Are we big endian or little endian?
-        magic = unpack('<i', buf[:4])[0]
+        magic = unpack('<i', buf[:4])[0] & MASK
         if magic == self.LE_MAGIC:
             version, msgcount, masteridx, transidx = unpack('<4i', buf[4:20])
             ii = '<ii'
@@ -145,15 +149,20 @@ class GNUTranslations(NullTranslations):
             ii = '>ii'
         else:
             raise IOError(0, 'Bad magic number', filename)
-        #
+        # more unsigned ints
+        msgcount &= MASK
+        masteridx &= MASK
+        transidx &= MASK
         # Now put all messages from the .mo file buffer into the catalog
         # dictionary.
         for i in xrange(0, msgcount):
             mlen, moff = unpack(ii, buf[masteridx:masteridx+8])
-            mend = moff + mlen
+            moff &= MASK
+            mend = moff + (mlen & MASK)
             tlen, toff = unpack(ii, buf[transidx:transidx+8])
-            tend = toff + tlen
-            if mend < len(buf) and tend < len(buf):
+            toff &= MASK
+            tend = toff + (tlen & MASK)
+            if mend < buflen and tend < buflen:
                 tmsg = buf[toff:tend]
                 catalog[buf[moff:mend]] = tmsg
             else: