X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fpython-systemd%2F_reader.c;h=bc5db19049577d079bba9db08bd3269d2d164597;hp=a678f69318055c94b14179aa3f13a7771d5b1a21;hb=68313d3dfa2082dae8a06643d639e0200afc19fc;hpb=fd587c876d480863d56bbbdc5e9fcf7e735d98f3 diff --git a/src/python-systemd/_reader.c b/src/python-systemd/_reader.c index a678f6931..bc5db1904 100644 --- a/src/python-systemd/_reader.c +++ b/src/python-systemd/_reader.c @@ -64,6 +64,10 @@ static PyStructSequence_Desc Monotonic_desc = { }; #endif +/** + * Convert a Python sequence object into a strv (char**), and + * None into a NULL pointer. + */ static int strv_converter(PyObject* obj, void *_result) { char ***result = _result; Py_ssize_t i, len; @@ -71,13 +75,22 @@ static int strv_converter(PyObject* obj, void *_result) { assert(result); if (!obj) - goto cleanup; + return 0; + + if (obj == Py_None) { + *result = NULL; + return 1; + } if (!PySequence_Check(obj)) return 0; len = PySequence_Length(obj); *result = new0(char*, len + 1); + if (!*result) { + set_error(-ENOMEM, NULL, NULL); + return 0; + } for (i = 0; i < len; i++) { PyObject *item; @@ -145,7 +158,7 @@ static int Reader_init(Reader *self, PyObject *args, PyObject *keywds) char **files = NULL; static const char* const kwlist[] = {"flags", "path", "files", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, keywds, "|izO&", (char**) kwlist, + if (!PyArg_ParseTupleAndKeywords(args, keywds, "|izO&:__init__", (char**) kwlist, &flags, &path, strv_converter, &files)) return -1;