Hello all,
I've been testing the python plugin of collectd today, and have spotted
an issue. A very simple python plugin will SIGSEV when launched from the
command line. I've experienced the same error on with debian package version
4.10.1+squeeze2, 5.1.0-3 and from source tarball collectd-5.2.0.tar.gz, on
both python 2.6 and 2.7
the plugin and config file can be found at:
http://collectd.org/documentation/manpages/collectd-python.5.shtml#writing_your_own_plugins
$ /opt/collectd/sbin/collectd -C ~/dev/collectd/collectd.cfg -T -f
python.spam (gauge): 18.903025
Erreur de segmentation
$
The backtrace is:
#0 0x00007ffff70ba4ff in ?? () from /lib/x86_64-linux-gnu/libc.so.6
#1 0x00007ffff69f222b in PyString_FromString () from
/usr/lib/libpython2.7.so.1.0
#2 0x00007ffff6d985c0 in cpy_string_to_unicode_or_bytes (timeout=0, id=0x0,
data=Unhandled dwarf expression opcode 0xf3) at cpython.h:158
#3 cpy_flush_callback (timeout=0, id=0x0, data=Unhandled dwarf expression
opcode 0xf3
) at python.c:509
#4 0x000000000040e861 in plugin_flush (plugin=0x0, timeout=0, identifier=0x0)
at plugin.c:1385
#5 0x000000000040e9f3 in plugin_shutdown_all () at plugin.c:1409
#6 0x000000000040699e in do_shutdown (argc=Unhandled dwarf expression opcode
0xf3
) at collectd.c:360
#7 main (argc=Unhandled dwarf expression opcode 0xf3
) at collectd.c:609
The problem comes from plugin_shutdown_all () in plugin.c:1409
plugin_flush (/* plugin = */ NULL,
/* timeout = */ 0,
/* identifier = */ NULL);
Identifier is set to NULL, and in cpy_string_to_unicode_or_bytes from
cpython.h:158 it is passed to PyString_FromString.
http://docs.python.org/2/c-api/string.html#PyString_FromString, says clearly
that the parameter can't be NULL and won't be checked.
I manage to make it work with the attach modification i.e replacing buf by an
empty string if it is NULL.
Regards,
Marcdiff -Nru a/collectd-5.2.0/src/cpython.h b/collectd-5.2.0/src/cpython.h
--- a/collectd-5.2.0/src/cpython.h 2012-11-29 19:18:09.000000000 +0100
+++ b/collectd-5.2.0/src/cpython.h 2012-11-30 11:27:52.000000000 +0100
@@ -155,7 +155,8 @@
PyErr_Clear();
return PyBytes_FromString(buf);
#else
- return PyString_FromString(buf);
+ return PyString_FromString(
+ buf != NULL ? buf : "" );
#endif
}
_______________________________________________
collectd mailing list
[email protected]
http://mailman.verplant.org/listinfo/collectd