From a45ed2ad6f92730a479522c46febb1b56b442aba Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Mon, 23 Nov 2015 02:15:33 +0000 Subject: [PATCH] Fix crash in lastupdate() method When a RRD database contains floating point values, the PyRRD_Int_FromString function returns NULL, which will then be tried to be put into a dictionary. This operation fails as PyDict_SetItemString does not handle NULL and the program crashes with SEGV. This patch parses the value as a floating point number and will add that instead. If the value could not be parsed, None will be added instead. Signed-off-by: Michael Tremer --- rrdtoolmodule.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/rrdtoolmodule.c b/rrdtoolmodule.c index dead4ff..4713850 100644 --- a/rrdtoolmodule.c +++ b/rrdtoolmodule.c @@ -880,9 +880,19 @@ _rrdtool_lastupdate(PyObject *self, PyObject *args) PyDict_SetItemString(ret, "ds", ds_dict); for (i = 0; i < ds_cnt; i++) { - PyDict_SetItemString(ds_dict, - ds_names[i], - PyRRD_Int_FromString(last_ds[i], NULL, 10)); + PyObject* val = Py_None; + + double num; + if (sscanf(last_ds[i], "%lf", &num) == 1) { + val = PyFloat_FromDouble(num); + } + + if (!val) + return NULL; + + PyDict_SetItemString(ds_dict, ds_names[i], val); + Py_DECREF(val); + free(last_ds[i]); free(ds_names[i]); } -- 2.47.2