Commit 42faa551 authored by Barry Warsaw's avatar Barry Warsaw

- Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to

  prevent readline() calls from consuming too much memory.  Patch by Jyrki
  Pulliainen.
parent e763a91f
......@@ -37,6 +37,13 @@ __all__ = ["NNTP","NNTPReplyError","NNTPTemporaryError",
"error_reply","error_temp","error_perm","error_proto",
"error_data",]
# maximal line length when calling readline(). This is to prevent
# reading arbitrary lenght lines. RFC 3977 limits NNTP line length to
# 512 characters, including CRLF. We have selected 2048 just to be on
# the safe side.
_MAXLINE = 2048
# Exceptions raised when an error or invalid response is received
class NNTPError(Exception):
"""Base class for all nntplib exceptions"""
......@@ -200,7 +207,9 @@ class NNTP:
def getline(self):
"""Internal: return one line from the server, stripping CRLF.
Raise EOFError if the connection is closed."""
line = self.file.readline()
line = self.file.readline(_MAXLINE + 1)
if len(line) > _MAXLINE:
raise NNTPDataError('line too long')
if self.debugging > 1:
print '*get*', repr(line)
if not line: raise EOFError
......
import socket
import threading
import nntplib
import time
from unittest import TestCase
from test import test_support
HOST = test_support.HOST
def server(evt, serv, evil=False):
serv.listen(5)
try:
conn, addr = serv.accept()
except socket.timeout:
pass
else:
if evil:
conn.send("1 I'm too long response" * 3000 + "\n")
else:
conn.send("1 I'm OK response\n")
conn.close()
finally:
serv.close()
evt.set()
class BaseServerTest(TestCase):
def setUp(self):
self.evt = threading.Event()
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.settimeout(3)
self.port = test_support.bind_port(self.sock)
threading.Thread(
target=server,
args=(self.evt, self.sock, self.evil)).start()
time.sleep(.1)
def tearDown(self):
self.evt.wait()
class ServerTests(BaseServerTest):
evil = False
def test_basic_connect(self):
nntp = nntplib.NNTP('localhost', self.port)
nntp.sock.close()
class EvilServerTests(BaseServerTest):
evil = True
def test_too_long_line(self):
self.assertRaises(nntplib.NNTPDataError,
nntplib.NNTP, 'localhost', self.port)
def test_main(verbose=None):
test_support.run_unittest(EvilServerTests)
test_support.run_unittest(ServerTests)
if __name__ == '__main__':
test_main()
......@@ -20,6 +20,10 @@ Library
prevent readline() calls from consuming too much memory. Patch by Jyrki
Pulliainen.
- Issue #16040: CVE-2013-1752: nntplib: Limit maximum line lengths to 2048 to
prevent readline() calls from consuming too much memory. Patch by Jyrki
Pulliainen.
- Issue #16039: CVE-2013-1752: Change use of readline in imaplib module to
limit line length. Patch by Emil Lind.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment