From 64e90b1e867da8e6d20bc44f1fc0385a87e37898 2011-10-14 18:29:17 From: MinRK 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.