From 64e90b1e867da8e6d20bc44f1fc0385a87e37898 2011-10-14 18:29:17
From: MinRK <benjaminrk@gmail.com>
Date: 2011-10-14 18:29:17
Subject: [PATCH] protect kernelapp/qtconsole from invalid connection files

(clean error/exit, rather than crash)

also use stdlib json to load connection file, not zmq.jsonapi, which can be
jsonlib2, which will return Longs, causing TraitError.

---

diff --git a/IPython/frontend/qt/console/qtconsoleapp.py b/IPython/frontend/qt/console/qtconsoleapp.py
index 0d4f1f2..eb26bfe 100644
--- a/IPython/frontend/qt/console/qtconsoleapp.py
+++ b/IPython/frontend/qt/console/qtconsoleapp.py
@@ -17,6 +17,7 @@ Authors:
 #-----------------------------------------------------------------------------
 
 # stdlib imports
+import json
 import os
 import signal
 import sys
@@ -24,7 +25,6 @@ import sys
 # System library imports
 from IPython.external.qt import QtGui
 from pygments.styles import get_all_styles
-from zmq.utils import jsonapi as json
 
 # Local imports
 from IPython.config.application import boolean_flag
@@ -373,7 +373,11 @@ class IPythonQtConsoleApp(BaseIPythonApplication):
         # should load_connection_file only be used for existing?
         # as it is now, this allows reusing ports if an existing
         # file is requested
-        self.load_connection_file()
+        try:
+            self.load_connection_file()
+        except Exception:
+            self.log.error("Failed to load connection file: %r", self.connection_file, exc_info=True)
+            self.exit(1)
     
     def load_connection_file(self):
         """load ip/port/hmac config from JSON connection file"""
diff --git a/IPython/zmq/kernelapp.py b/IPython/zmq/kernelapp.py
index 2bcfed9..2459281 100644
--- a/IPython/zmq/kernelapp.py
+++ b/IPython/zmq/kernelapp.py
@@ -16,12 +16,12 @@ Authors
 #-----------------------------------------------------------------------------
 
 # Standard library imports.
+import json
 import os
 import sys
 
 # System library imports.
 import zmq
-from zmq.utils import jsonapi as json
 
 # IPython imports.
 from IPython.core.ultratb import FormattedTB
@@ -192,8 +192,11 @@ class KernelApp(BaseIPythonApplication):
     def init_connection_file(self):
         if not self.connection_file:
             self.connection_file = "kernel-%s.json"%os.getpid()
-        
-        self.load_connection_file()
+        try:
+            self.load_connection_file()
+        except Exception:
+            self.log.error("Failed to load connection file: %r", self.connection_file, exc_info=True)
+            self.exit(1)
     
     def init_sockets(self):
         # Create a context, a session, and the kernel sockets.