]> granicus.if.org Git - python/commitdiff
in poplib, limit maximum line length that we read from the network (closes #16041)
authorBenjamin Peterson <benjamin@python.org>
Sat, 6 Dec 2014 01:02:38 +0000 (20:02 -0500)
committerBenjamin Peterson <benjamin@python.org>
Sat, 6 Dec 2014 01:02:38 +0000 (20:02 -0500)
Patch from Berker Peksag.

Lib/poplib.py
Lib/test/test_poplib.py
Misc/NEWS

index dc7cbdf062eff446dc048d1ffc8b402350764bae..b91e5f72d2ca26f718eecdcd0385457f5f5055eb 100644 (file)
@@ -32,6 +32,12 @@ CR = '\r'
 LF = '\n'
 CRLF = CR+LF
 
+# maximal line length when calling readline(). This is to prevent
+# reading arbitrary length lines. RFC 1939 limits POP3 line length to
+# 512 characters, including CRLF. We have selected 2048 just to be on
+# the safe side.
+_MAXLINE = 2048
+
 
 class POP3:
 
@@ -103,7 +109,9 @@ class POP3:
     # Raise error_proto('-ERR EOF') if the connection is closed.
 
     def _getline(self):
-        line = self.file.readline()
+        line = self.file.readline(_MAXLINE + 1)
+        if len(line) > _MAXLINE:
+            raise error_proto('line too long')
         if self._debugging > 1: print '*get*', repr(line)
         if not line: raise error_proto('-ERR EOF')
         octets = len(line)
@@ -365,6 +373,8 @@ else:
             match = renewline.match(self.buffer)
             while not match:
                 self._fillBuffer()
+                if len(self.buffer) > _MAXLINE:
+                    raise error_proto('line too long')
                 match = renewline.match(self.buffer)
             line = match.group(0)
             self.buffer = renewline.sub('' ,self.buffer, 1)
index af48fdd4f3cd86bc2ca29a4aa1ec5e434c45f604..23d688724b95c99ee30cac01ff6515c984c71a0d 100644 (file)
@@ -198,6 +198,10 @@ class TestPOP3Class(TestCase):
                     113)
         self.assertEqual(self.client.retr('foo'), expected)
 
+    def test_too_long_lines(self):
+        self.assertRaises(poplib.error_proto, self.client._shortcmd,
+                          'echo +%s' % ((poplib._MAXLINE + 10) * 'a'))
+
     def test_dele(self):
         self.assertOK(self.client.dele('foo'))
 
index 01f23ef6175290da54f1cf43e3409b03f63ce5d7..cee5b858672326338e06826c34738e2ce0f34654 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 2.7.9?
 Library
 -------
 
+- Issue #16041: In poplib, limit maximum line length read from the server to
+  prevent CVE-2013-1752.
+
 - Issue #22960: Add a context argument to xmlrpclib.ServerProxy.