]> granicus.if.org Git - python/commitdiff
Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more
authorBerker Peksag <berker.peksag@gmail.com>
Tue, 5 Aug 2014 04:15:57 +0000 (07:15 +0300)
committerBerker Peksag <berker.peksag@gmail.com>
Tue, 5 Aug 2014 04:15:57 +0000 (07:15 +0300)
than 100 headers are read.

Patch by Jyrki Pulliainen and Daniel Eriksson.

Lib/httplib.py
Lib/test/test_httplib.py
Misc/NEWS

index 5368cd98274beac2090066c19e338153712eb1ec..b2f6e5c3f56032c31a57a55d3729d818dd3cb0ec 100644 (file)
@@ -215,6 +215,10 @@ MAXAMOUNT = 1048576
 # maximal line length when calling readline().
 _MAXLINE = 65536
 
+# maximum amount of headers accepted
+_MAXHEADERS = 100
+
+
 class HTTPMessage(mimetools.Message):
 
     def addheader(self, key, value):
@@ -271,6 +275,8 @@ class HTTPMessage(mimetools.Message):
         elif self.seekable:
             tell = self.fp.tell
         while True:
+            if len(hlist) > _MAXHEADERS:
+                raise HTTPException("got more than %d headers" % _MAXHEADERS)
             if tell:
                 try:
                     startofline = tell()
index 72800e56ce2e5f2783f504c73edbb14488831e39..4b2a638a49a1692a03517178bbafa1ec1991b91f 100644 (file)
@@ -262,6 +262,13 @@ class BasicTest(TestCase):
         if resp.read() != "":
             self.fail("Did not expect response from HEAD request")
 
+    def test_too_many_headers(self):
+        headers = '\r\n'.join('Header%d: foo' % i for i in xrange(200)) + '\r\n'
+        text = ('HTTP/1.1 200 OK\r\n' + headers)
+        s = FakeSocket(text)
+        r = httplib.HTTPResponse(s)
+        self.assertRaises(httplib.HTTPException, r.begin)
+
     def test_send_file(self):
         expected = 'GET /foo HTTP/1.1\r\nHost: example.com\r\n' \
                    'Accept-Encoding: identity\r\nContent-Length:'
index 27a632213c10972759dba393e24ccdc89189ad23..1d9c9547fb5bc6cb453231e34464e80f330f655d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -19,6 +19,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #16037: HTTPMessage.readheaders() raises an HTTPException when more
+  than 100 headers are read. Patch by Jyrki Pulliainen and Daniel Eriksson.
+
 - Issue #21580: Now Tkinter correctly handles binary "data" and "maskdata"
   configure options of tkinter.PhotoImage.