The regular expression that matched keys was too loose, so things like

  Foo: : bar

would get parsed as

  {'Foo:': 'bar'}

instead of the correct value (which is also returned by both apt_pkg and
the email package),

  {'Foo': ': bar'}

Closes: #597249
---
 debian/changelog     |    1 +
 lib/debian/deb822.py |    8 +++++---
 tests/test_deb822.py |    8 ++++++++
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/debian/changelog b/debian/changelog
index 492b5df..4010029 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,6 +1,7 @@
 python-debian (0.1.19) UNRELEASED; urgency=low
 
   * Avoid dumping unparseable data. (Closes: #597120)
+  * Allow ':' as the first character of a value. (Closes: #597249)
 
  -- John Wright <j...@debian.org>  Sat, 18 Sep 2010 00:47:04 -0600
 
diff --git a/lib/debian/deb822.py b/lib/debian/deb822.py
index fc87124..47c921d 100644
--- a/lib/debian/deb822.py
+++ b/lib/debian/deb822.py
@@ -317,9 +317,11 @@ class Deb822(Deb822Dict):
     ###
 
     def _internal_parser(self, sequence, fields=None):
-        single = re.compile("^(?P<key>\S+)\s*:\s*(?P<data>\S.*?)\s*$")
-        multi = re.compile("^(?P<key>\S+)\s*:\s*$")
-        multidata = re.compile("^\s(?P<data>.+?)\s*$")
+        # The key is non-whitespace, non-colon characters before any colon.
+        key_part = r"^(?P<key>[^: \t\n\r\f\v]+)\s*:\s*"
+        single = re.compile(key_part + r"(?P<data>\S.*?)\s*$")
+        multi = re.compile(key_part + r"$")
+        multidata = re.compile(r"^\s(?P<data>.+?)\s*$")
 
         wanted_field = lambda f: fields is None or f in fields
 
diff --git a/tests/test_deb822.py b/tests/test_deb822.py
index 64fd77a..b03b13f 100755
--- a/tests/test_deb822.py
+++ b/tests/test_deb822.py
@@ -753,6 +753,14 @@ Description: python modules to work with Debian-related 
data formats
         d['Files'] = [{'md5sum': 'deadbeef', 'size': '9605', 'name': 'bad\n'}]
         self.assertRaises(ValueError, d.get_as_string, 'files')
 
+    def test_bug597249_colon_as_first_value_character(self):
+        """Colon should be allowed as the first value character. See #597249.
+        """
+
+        data = 'Foo: : bar'
+        parsed = {'Foo': ': bar'}
+        self.assertWellParsed(deb822.Deb822(data), parsed)
+
 
 class TestPkgRelations(unittest.TestCase):
 
-- 
1.7.1




-- 
To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org

Reply via email to