Better protection against malformed JSON.
authorEric S. Raymond <esr@thyrsus.com>
Mon, 1 Oct 2012 23:19:46 +0000 (19:19 -0400)
committerEric S. Raymond <esr@thyrsus.com>
Mon, 1 Oct 2012 23:19:46 +0000 (19:19 -0400)
irkerd

diff --git a/irkerd b/irkerd
index 9207ae1dec7cea20df3b60f9e96264e073884af8..44aca0b774db56db7d746152e2ea6898b0ae901b 100755 (executable)
--- a/irkerd
+++ b/irkerd
@@ -363,11 +363,6 @@ class Irker:
     def handle(self, line):
         "Perform a JSON relay request."
         try:
-            # Without this guard, a line consisting of a thousand '[' chars
-            # can crash irker by inducing the JSON parser to blow Python's
-            # recursion stack. 
-            if line.count("[") > 256 or line.count("{") > 256:
-                raise ValueError
             request = json.loads(line.strip())
             if type(request) != type({}):
                 self.logerr("request in tot a JSON dictionary: %s" % repr(request))
@@ -419,6 +414,8 @@ class Irker:
                                 del self.servers[oldest]
         except ValueError:
             self.logerr("can't recognize JSON on input: %s" % repr(line))
+        except RuntimeException:
+            self.logerr("wildly malformed JSON blew the parser stack.")
 
 class IrkerTCPHandler(SocketServer.StreamRequestHandler):
     def handle(self):