An interpreted, interactive, object-oriented programming language
CentOS Sources
2017-08-01 71084d584ff953f5463757ec6536406320560b4d
commit | author | age
f63228 1
CS 2 # HG changeset patch
3 # User Benjamin Peterson <benjamin@python.org>
4 # Date 1417827758 18000
5 # Node ID 339f877cca115c1901f5dd93d7bc066031d2a669
6 # Parent  54af094087953f4997a4ead63e949d845c4b4412
7 in poplib, limit maximum line length that we read from the network (closes #16041)
8
9 Patch from Berker Peksag.
10
11 diff --git a/Lib/poplib.py b/Lib/poplib.py
12 --- a/Lib/poplib.py
13 +++ b/Lib/poplib.py
14 @@ -32,6 +32,12 @@ CR = '\r'
15  LF = '\n'
16  CRLF = CR+LF
17  
18 +# maximal line length when calling readline(). This is to prevent
19 +# reading arbitrary length lines. RFC 1939 limits POP3 line length to
20 +# 512 characters, including CRLF. We have selected 2048 just to be on
21 +# the safe side.
22 +_MAXLINE = 2048
23 +
24  
25  class POP3:
26  
27 @@ -103,7 +109,9 @@ class POP3:
28      # Raise error_proto('-ERR EOF') if the connection is closed.
29  
30      def _getline(self):
31 -        line = self.file.readline()
32 +        line = self.file.readline(_MAXLINE + 1)
33 +        if len(line) > _MAXLINE:
34 +            raise error_proto('line too long')
35          if self._debugging > 1: print '*get*', repr(line)
36          if not line: raise error_proto('-ERR EOF')
37          octets = len(line)
38 @@ -365,6 +373,8 @@ else:
39              match = renewline.match(self.buffer)
40              while not match:
41                  self._fillBuffer()
42 +                if len(self.buffer) > _MAXLINE:
43 +                    raise error_proto('line too long')
44                  match = renewline.match(self.buffer)
45              line = match.group(0)
46              self.buffer = renewline.sub('' ,self.buffer, 1)
47 diff --git a/Lib/test/test_poplib.py b/Lib/test/test_poplib.py
48 --- a/Lib/test/test_poplib.py
49 +++ b/Lib/test/test_poplib.py
50 @@ -198,6 +198,10 @@ class TestPOP3Class(TestCase):
51                      113)
52          self.assertEqual(self.client.retr('foo'), expected)
53  
54 +    def test_too_long_lines(self):
55 +        self.assertRaises(poplib.error_proto, self.client._shortcmd,
56 +                          'echo +%s' % ((poplib._MAXLINE + 10) * 'a'))
57 +
58      def test_dele(self):
59          self.assertOK(self.client.dele('foo'))
60