]> granicus.if.org Git - python/commitdiff
#17898: reset k and v so that the loop doesn't use an old value
authorAndrew Kuchling <amk@amk.ca>
Tue, 14 Apr 2015 14:03:35 +0000 (10:03 -0400)
committerAndrew Kuchling <amk@amk.ca>
Tue, 14 Apr 2015 14:03:35 +0000 (10:03 -0400)
Lib/gettext.py
Lib/test/test_gettext.py
Misc/NEWS

index 247f37804fdf08834f2e1dd2d0c06ca840fce92d..43202c46f49d86fb4b8c38defcad60bd297ccd9d 100644 (file)
@@ -296,11 +296,12 @@ class GNUTranslations(NullTranslations):
             # See if we're looking at GNU .mo conventions for metadata
             if mlen == 0:
                 # Catalog description
-                lastk = k = None
+                lastk = None
                 for item in tmsg.splitlines():
                     item = item.strip()
                     if not item:
                         continue
+                    k = v = None
                     if ':' in item:
                         k, v = item.split(':', 1)
                         k = k.strip().lower()
index f0369543e0fea2b606b27ec8e9c48671977274ba..3f792bb50654d877da1358c7de344e7c4aeb9963 100644 (file)
@@ -80,6 +80,12 @@ class GettextBaseTest(unittest.TestCase):
         del self.env
         shutil.rmtree(os.path.split(LOCALEDIR)[0])
 
+GNU_MO_DATA_ISSUE_17898 = b'''\
+3hIElQAAAAABAAAAHAAAACQAAAAAAAAAAAAAAAAAAAAsAAAAggAAAC0AAAAAUGx1cmFsLUZvcm1z
+OiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7CiMtIy0jLSMtIyAgbWVzc2FnZXMucG8gKEVk
+WCBTdHVkaW8pICAjLSMtIy0jLSMKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVU
+Ri04CgA=
+'''
 
 class GettextTestCase1(GettextBaseTest):
     def setUp(self):
@@ -291,6 +297,14 @@ class PluralFormsTestCase(GettextBaseTest):
         # Test for a dangerous expression
         raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
 
+class GNUTranslationParsingTest(GettextBaseTest):
+    def test_plural_form_error_issue17898(self):
+        with open(MOFILE, 'wb') as fp:
+            fp.write(base64.decodestring(GNU_MO_DATA_ISSUE_17898))
+        with open(MOFILE, 'rb') as fp:
+            # If this runs cleanly, the bug is fixed.
+            t = gettext.GNUTranslations(fp)
+
 
 class UnicodeTranslationsTest(GettextBaseTest):
     def setUp(self):
@@ -465,3 +479,16 @@ msgstr ""
 "Content-Transfer-Encoding: quoted-printable\n"
 "Generated-By: pygettext.py 1.3\n"
 '''
+
+#
+# messages.po, used for bug 17898
+#
+
+'''
+# test file for http://bugs.python.org/issue17898
+msgid ""
+msgstr ""
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"#-#-#-#-#  messages.po (EdX Studio)  #-#-#-#-#\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+'''
index 90a14390cc7102d2b1224a3deab59332f2d62eb3..d39d5455447378d2b53760f198295ffc55cc7d36 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,8 @@ Core and Builtins
 Library
 -------
 
+- Issue #17898: Fix exception in gettext.py when parsing certain plural forms.
+
 - Issue #23865: close() methods in multiple modules now are idempotent and more
   robust at shutdown. If needs to release multiple resources, they are released
   even if errors are occured.