From: Alexandru Gagniuc Date: Wed, 6 May 2015 07:32:30 +0000 (-0700) Subject: bindings/python: Handle import failures without crashing X-Git-Tag: libsigrok-0.4.0~486 X-Git-Url: http://sigrok.org/gitweb/?p=libsigrok.git;a=commitdiff_plain;h=aae2273b99b9155ea1b91bc65eb4c91e06e3c8e2 bindings/python: Handle import failures without crashing When the import of gi.repository.GLib failed, we would get a NULL pointer that we passed along without any checking. In this situation, the entire program would crash with a segmentation fault, and no message to indicate the problem. When the import fails, abort the SWIG init and print a message. The Python interpreter then prints out a backtrace, which can be useful in tracking down the problem. --- diff --git a/bindings/python/sigrok/core/classes.i b/bindings/python/sigrok/core/classes.i index 12e7df32..2afe5791 100644 --- a/bindings/python/sigrok/core/classes.i +++ b/bindings/python/sigrok/core/classes.i @@ -45,9 +45,11 @@ which provides access to the error code and description." %module(docstring=DOCSTRING) classes %{ +#include #include #include +PyObject *PyGObject_lib; PyObject *GLib; PyTypeObject *IOChannel; PyTypeObject *PollFD; @@ -63,8 +65,18 @@ typedef guint pyg_flags_type; %} %init %{ - pygobject_init(-1, -1, -1); + PyGObject_lib = pygobject_init(-1, -1, -1); + if (!PyGObject_lib) + fprintf(stderr, "pygobject initialization failed.\n"); GLib = PyImport_ImportModule("gi.repository.GLib"); + /* + * This check can't save us if the import fails, but at least it gives us + * a starting point to trace the issue versus straight out crashing. + */ + if (!GLib) { + fprintf(stderr, "Import of gi.repository.GLib failed.\n"); + return; + } IOChannel = (PyTypeObject *) PyObject_GetAttrString(GLib, "IOChannel"); PollFD = (PyTypeObject *) PyObject_GetAttrString(GLib, "PollFD"); import_array();