Blame SOURCES/00205-CVE-2013-1752-httplib-headers.patch

925e6b
925e6b
# HG changeset patch
925e6b
# User Berker Peksag <berker.peksag@gmail.com>
925e6b
# Date 1407212157 -10800
925e6b
# Node ID 5e310c6a8520603bca8bc4b40eaf4f074db47c0d
925e6b
# Parent  46c7a724b487295257423a69478392cb01ce74e6
925e6b
Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more
925e6b
than 100 headers are read.
925e6b
925e6b
Patch by Jyrki Pulliainen and Daniel Eriksson.
925e6b
925e6b
diff --git a/Lib/httplib.py b/Lib/httplib.py
925e6b
--- a/Lib/httplib.py
925e6b
+++ b/Lib/httplib.py
925e6b
@@ -215,6 +215,10 @@ MAXAMOUNT = 1048576
925e6b
 # maximal line length when calling readline().
925e6b
 _MAXLINE = 65536
925e6b
 
925e6b
+# maximum amount of headers accepted
925e6b
+_MAXHEADERS = 100
925e6b
+
925e6b
+
925e6b
 class HTTPMessage(mimetools.Message):
925e6b
 
925e6b
     def addheader(self, key, value):
925e6b
@@ -271,6 +275,8 @@ class HTTPMessage(mimetools.Message):
925e6b
         elif self.seekable:
925e6b
             tell = self.fp.tell
925e6b
         while True:
925e6b
+            if len(hlist) > _MAXHEADERS:
925e6b
+                raise HTTPException("got more than %d headers" % _MAXHEADERS)
925e6b
             if tell:
925e6b
                 try:
925e6b
                     startofline = tell()
925e6b
diff --git a/Lib/test/test_httplib.py b/Lib/test/test_httplib.py
925e6b
--- a/Lib/test/test_httplib.py
925e6b
+++ b/Lib/test/test_httplib.py
925e6b
@@ -262,6 +262,13 @@ class BasicTest(TestCase):
925e6b
         if resp.read() != "":
925e6b
             self.fail("Did not expect response from HEAD request")
925e6b
 
925e6b
+    def test_too_many_headers(self):
925e6b
+        headers = '\r\n'.join('Header%d: foo' % i for i in xrange(200)) + '\r\n'
925e6b
+        text = ('HTTP/1.1 200 OK\r\n' + headers)
925e6b
+        s = FakeSocket(text)
925e6b
+        r = httplib.HTTPResponse(s)
925e6b
+        self.assertRaises(httplib.HTTPException, r.begin)
925e6b
+
925e6b
     def test_send_file(self):
925e6b
         expected = 'GET /foo HTTP/1.1\r\nHost: example.com\r\n' \
925e6b
                    'Accept-Encoding: identity\r\nContent-Length:'