Closes #85.
Signed-off-by: Martin Milata mmilata@redhat.com --- python/py_koops_stacktrace.c | 28 ++++++++++++++++++++++++++++ python/py_koops_stacktrace.h | 3 +++ tests/python/koops.py | 14 ++++++++++++++ 3 files changed, 45 insertions(+)
diff --git a/python/py_koops_stacktrace.c b/python/py_koops_stacktrace.c index 39c43c9..301aaf2 100644 --- a/python/py_koops_stacktrace.c +++ b/python/py_koops_stacktrace.c @@ -1,5 +1,6 @@ #include "py_koops_frame.h" #include "py_koops_stacktrace.h" +#include "py_common.h" #include "lib/strbuf.h" #include "lib/koops_frame.h" #include "lib/koops_stacktrace.h" @@ -25,6 +26,8 @@ "specified, the result includes only that much topmost frames.\n"
#define b_frames_doc "A list containing frames" +#define b_taint_flags_doc "Dictionary of kernel taint flags. Keys are the flag names,\n" \ + "values are booleans indicating whether the flag is set." #define b_modules_doc "Modules loaded at the time of the event (list of strings)"
@@ -49,6 +52,7 @@ static PyGetSetDef koops_stacktrace_getset[] = { { (char*)"modules", sr_py_koops_stacktrace_get_modules, sr_py_koops_stacktrace_set_modules, (char*)b_modules_doc, NULL }, + { (char*)"taint_flags", sr_py_koops_stacktrace_get_taint_flags, sr_py_koops_stacktrace_set_taint_flags, (char*)b_taint_flags_doc, NULL }, { NULL }, };
@@ -170,6 +174,30 @@ sr_py_koops_stacktrace_set_modules(PyObject *self, PyObject *rhs, void *data) }
PyObject * +sr_py_koops_stacktrace_get_taint_flags(PyObject *self, void *data) +{ + struct sr_koops_stacktrace *st = ((struct sr_py_koops_stacktrace*)self)->stacktrace; + PyObject *flags = PyDict_New(); + + struct sr_taint_flag *f; + for (f = sr_flags; f->letter; f++) + { + PyObject *val = MEMB_T(bool, st, f->member_offset) ? Py_True : Py_False; + if (PyDict_SetItemString(flags, f->name, val) == -1) + return NULL; + } + + return flags; +} + +int +sr_py_koops_stacktrace_set_taint_flags(PyObject *self, PyObject *rhs, void *data) +{ + PyErr_SetString(PyExc_NotImplementedError, "Setting taint flags is not implemented."); + return -1; +} + +PyObject * koops_frame_linked_list_to_python_list(struct sr_koops_stacktrace *stacktrace) { PyObject *result = PyList_New(0); diff --git a/python/py_koops_stacktrace.h b/python/py_koops_stacktrace.h index 28d7cba..100be66 100644 --- a/python/py_koops_stacktrace.h +++ b/python/py_koops_stacktrace.h @@ -38,6 +38,7 @@ struct sr_py_koops_stacktrace { PyObject_HEAD PyObject *frames; + PyObject *taint_flags; struct sr_koops_stacktrace *stacktrace; };
@@ -55,6 +56,8 @@ PyObject *sr_py_koops_stacktrace_str(PyObject *self); /* getters & setters */ PyObject *sr_py_koops_stacktrace_get_modules(PyObject *self, void *data); int sr_py_koops_stacktrace_set_modules(PyObject *self, PyObject *rhs, void *data); +PyObject *sr_py_koops_stacktrace_get_taint_flags(PyObject *self, void *data); +int sr_py_koops_stacktrace_set_taint_flags(PyObject *self, PyObject *rhs, void *data);
/* methods */ PyObject *sr_py_koops_stacktrace_dup(PyObject *self, PyObject *args); diff --git a/tests/python/koops.py b/tests/python/koops.py index 4f4cafa..58189c8 100755 --- a/tests/python/koops.py +++ b/tests/python/koops.py @@ -41,6 +41,20 @@ class TestKerneloops(BindingsTestCase): #self.assertEqual(len(self.koops.modules), 2) self.assertRaises(NotImplementedError, self.koops.__delattr__, 'modules')
+ def test_correct_taint_flags(self): + for val in self.koops.taint_flags.values(): + self.assertFalse(val); + path = '../kerneloopses/rhbz-827868-modified' + if not os.path.isfile(path): + path = '../' + path + with file(path) as f: + contents = f.read() + tainted_koops = satyr.Kerneloops(contents) + + true_flags = { f for (f, v) in tainted_koops.taint_flags.items() if v == True} + self.assertEqual(true_flags, + set(['module_proprietary', 'page_release', 'died_recently', 'module_out_of_tree'])) + def test_dup(self): dup = self.koops.dup() self.assertNotEqual(id(dup.frames), id(self.koops.frames))