[SATYR PATCH 2/2] python: expose koops taint flags as a dict

Martin Milata mmilata at redhat.com
Fri Jun 7 10:48:31 UTC 2013


Closes #85.

Signed-off-by: Martin Milata <mmilata at 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))
-- 
1.7.11.7



More information about the Crash-catcher mailing list