diff --git a/src/python.c b/src/python.c
index 22f3db640045bad6ef0dc67c1f425ce48d0a80de..44292f90a997de45364ca369ca230e6bb0b5185a 100644 (file)
--- a/src/python.c
+++ b/src/python.c
Py_XDECREF(traceback);
return;
}
- list = PyObject_CallFunction(cpy_format_exception, "NNN", type, value, traceback); /* New reference. */
+ list = PyObject_CallFunction(cpy_format_exception, "NNN", type, value, traceback); /* New reference. Steals references from "type", "value" and "traceback". */
if (list)
l = PyObject_Length(list);
+
for (i = 0; i < l; ++i) {
- char *s;
PyObject *line;
-
+ char const *msg;
+ char *cpy;
+
line = PyList_GET_ITEM(list, i); /* Borrowed reference. */
Py_INCREF(line);
- s = strdup(cpy_unicode_or_bytes_to_string(&line));
+
+ msg = cpy_unicode_or_bytes_to_string(&line);
Py_DECREF(line);
- if (s[strlen(s) - 1] == '\n')
- s[strlen(s) - 1] = 0;
+ if (msg == NULL)
+ continue;
+
+ cpy = strdup(msg);
+ if (cpy == NULL)
+ continue;
+
+ if (cpy[strlen(cpy) - 1] == '\n')
+ cpy[strlen(cpy) - 1] = 0;
+
Py_BEGIN_ALLOW_THREADS
- ERROR("%s", s);
+ ERROR("%s", cpy);
Py_END_ALLOW_THREADS
- free(s);
+
+ free(cpy);
}
+
Py_XDECREF(list);
PyErr_Clear();
- Py_DECREF(type);
- Py_XDECREF(value);
- Py_XDECREF(traceback);
}
static int cpy_read_callback(user_data_t *data) {
@@ -433,8 +443,8 @@ static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_li
sstrncpy(v->data.type_instance, value_list->type_instance, sizeof(v->data.type_instance));
sstrncpy(v->data.plugin, value_list->plugin, sizeof(v->data.plugin));
sstrncpy(v->data.plugin_instance, value_list->plugin_instance, sizeof(v->data.plugin_instance));
- v->data.time = value_list->time;
- v->interval = value_list->interval;
+ v->data.time = CDTIME_T_TO_DOUBLE(value_list->time);
+ v->interval = CDTIME_T_TO_DOUBLE(value_list->interval);
Py_CLEAR(v->values);
v->values = list;
Py_CLEAR(v->meta);
@@ -463,7 +473,7 @@ static int cpy_notification_callback(const notification_t *notification, user_da
sstrncpy(n->data.type_instance, notification->type_instance, sizeof(n->data.type_instance));
sstrncpy(n->data.plugin, notification->plugin, sizeof(n->data.plugin));
sstrncpy(n->data.plugin_instance, notification->plugin_instance, sizeof(n->data.plugin_instance));
- n->data.time = notification->time;
+ n->data.time = CDTIME_T_TO_DOUBLE(notification->time);
sstrncpy(n->message, notification->message, sizeof(n->message));
n->severity = notification->severity;
ret = PyObject_CallFunctionObjArgs(c->callback, n, c->data, (void *) 0); /* New reference. */
@@ -537,7 +547,12 @@ static PyObject *cpy_register_generic(cpy_callback_t **list_head, PyObject *args
Py_INCREF(callback);
Py_XINCREF(data);
+
c = malloc(sizeof(*c));
+ if (c == NULL)
+ return NULL;
+ memset (c, 0, sizeof (*c));
+
c->name = strdup(buf);
c->callback = callback;
c->data = data;
@@ -576,7 +591,7 @@ static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObjec
char buf[512];
reg_function_t *register_function = (reg_function_t *) reg;
cpy_callback_t *c = NULL;
- user_data_t *user_data = NULL;
+ user_data_t user_data;
char *name = NULL;
PyObject *callback = NULL, *data = NULL;
static char *kwlist[] = {"callback", "data", "name", NULL};
@@ -592,22 +607,29 @@ static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObjec
Py_INCREF(callback);
Py_XINCREF(data);
+
c = malloc(sizeof(*c));
+ if (c == NULL)
+ return NULL;
+ memset (c, 0, sizeof (*c));
+
c->name = strdup(buf);
c->callback = callback;
c->data = data;
c->next = NULL;
- user_data = malloc(sizeof(*user_data));
- user_data->free_func = cpy_destroy_user_data;
- user_data->data = c;
- register_function(buf, handler, user_data);
+
+ memset (&user_data, 0, sizeof (user_data));
+ user_data.free_func = cpy_destroy_user_data;
+ user_data.data = c;
+
+ register_function(buf, handler, &user_data);
return cpy_string_to_unicode_or_bytes(buf);
}
static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwds) {
char buf[512];
cpy_callback_t *c = NULL;
- user_data_t *user_data = NULL;
+ user_data_t user_data;
double interval = 0;
char *name = NULL;
PyObject *callback = NULL, *data = NULL;
@@ -625,18 +647,26 @@ static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwd
Py_INCREF(callback);
Py_XINCREF(data);
+
c = malloc(sizeof(*c));
+ if (c == NULL)
+ return NULL;
+ memset (c, 0, sizeof (*c));
+
c->name = strdup(buf);
c->callback = callback;
c->data = data;
c->next = NULL;
- user_data = malloc(sizeof(*user_data));
- user_data->free_func = cpy_destroy_user_data;
- user_data->data = c;
+
+ memset (&user_data, 0, sizeof (user_data));
+ user_data.free_func = cpy_destroy_user_data;
+ user_data.data = c;
+
ts.tv_sec = interval;
ts.tv_nsec = (interval - ts.tv_sec) * 1000000000;
- plugin_register_complex_read(/* group = */ NULL, buf,
- cpy_read_callback, &ts, user_data);
+ plugin_register_complex_read(/* group = */ "python", buf,
+ cpy_read_callback, &ts, &user_data);
+
return cpy_string_to_unicode_or_bytes(buf);
}
@@ -736,7 +766,7 @@ static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *ar
for (tmp = *list_head; tmp; prev = tmp, tmp = tmp->next)
if (strcmp(name, tmp->name) == 0)
break;
-
+
Py_DECREF(arg);
if (tmp == NULL) {
PyErr_Format(PyExc_RuntimeError, "Unable to unregister %s callback '%s'.", desc, name);
pthread_sigmask(SIG_BLOCK, &sigset, NULL);
state = PyEval_SaveThread();
if (do_interactive) {
- if (pthread_create(&thread, NULL, cpy_interactive, NULL)) {
+ if (plugin_thread_create(&thread, NULL, cpy_interactive, NULL)) {
ERROR("python: Error creating thread for interactive interpreter.");
}
}