python: improve convert_tuple_to_char_pointer_array

convert_tuple_to_char_pointer_array now also accepts lists and not only
tuples when converting to a C array. Other fixes:

 - some checking that it's actually a list/tuple before trying to
   convert
 - off-by-a-few-bytes allocation error
   (sizeof(char *)*n+1 vs. sizeof(char *)*(n+1)/calloc(...))

Signed-off-by: Christian Seiler <christian@iwakd.de>
Acked-by: Serge E. Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
Christian Seiler 2013-08-13 21:36:58 +02:00 committed by Serge Hallyn
parent 626ad11bfe
commit b7f2846aab

View File

@ -34,10 +34,18 @@ typedef struct {
char** char**
convert_tuple_to_char_pointer_array(PyObject *argv) { convert_tuple_to_char_pointer_array(PyObject *argv) {
int argc = PyTuple_GET_SIZE(argv); int argc;
int i, j; int i, j;
char **result = (char**) malloc(sizeof(char*)*argc + 1); /* not a list or tuple */
if (!PyList_Check(argv) && !PyTuple_Check(argv)) {
PyErr_SetString(PyExc_TypeError, "Expected list or tuple.");
return NULL;
}
argc = PySequence_Fast_GET_SIZE(argv);
char **result = (char**) calloc(argc + 1, sizeof(char*));
if (result == NULL) { if (result == NULL) {
PyErr_SetNone(PyExc_MemoryError); PyErr_SetNone(PyExc_MemoryError);
@ -45,7 +53,7 @@ convert_tuple_to_char_pointer_array(PyObject *argv) {
} }
for (i = 0; i < argc; i++) { for (i = 0; i < argc; i++) {
PyObject *pyobj = PyTuple_GET_ITEM(argv, i); PyObject *pyobj = PySequence_Fast_GET_ITEM(argv, i);
assert(pyobj != NULL); assert(pyobj != NULL);
char *str = NULL; char *str = NULL;