From: Michael Tremer Date: Mon, 23 Nov 2015 02:15:33 +0000 (+0000) Subject: Fix crash in lastupdate() method X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fheads%2Ffix-lastupdate-crash;p=people%2Fms%2Fpython-rrdtool.git 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 --- 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]); }