2
0
mirror of git://github.com/lxc/lxc synced 2025-09-01 08:29:06 +00:00

python: Fix memory management

Signed-off-by: Stéphane Graber <stgraber@ubuntu.com>
This commit is contained in:
Stéphane Graber
2013-04-11 14:15:21 +02:00
parent 75129865d4
commit e649c8032f

View File

@@ -1,7 +1,7 @@
/* /*
* python-lxc: Python bindings for LXC * python-lxc: Python bindings for LXC
* *
* (C) Copyright Canonical Ltd. 2012 * (C) Copyright Canonical Ltd. 2012-2013
* *
* Authors: * Authors:
* Stéphane Graber <stgraber@ubuntu.com> * Stéphane Graber <stgraber@ubuntu.com>
@@ -43,9 +43,10 @@ convert_tuple_to_char_pointer_array(PyObject *argv) {
PyObject *pyobj = PyTuple_GetItem(argv, i); PyObject *pyobj = PyTuple_GetItem(argv, i);
char *str = NULL; char *str = NULL;
PyObject *pystr; PyObject *pystr = NULL;
if (!PyUnicode_Check(pyobj)) { if (!PyUnicode_Check(pyobj)) {
PyErr_SetString(PyExc_ValueError, "Expected a string"); PyErr_SetString(PyExc_ValueError, "Expected a string");
free(result);
return NULL; return NULL;
} }
@@ -62,6 +63,7 @@ convert_tuple_to_char_pointer_array(PyObject *argv) {
static void static void
Container_dealloc(Container* self) Container_dealloc(Container* self)
{ {
lxc_container_put(self->container);
Py_TYPE(self)->tp_free((PyObject*)self); Py_TYPE(self)->tp_free((PyObject*)self);
} }
@@ -190,9 +192,11 @@ Container_create(Container *self, PyObject *args, PyObject *kwds)
} }
if (self->container->create(self->container, template_name, create_args)) { if (self->container->create(self->container, template_name, create_args)) {
free(create_args);
Py_RETURN_TRUE; Py_RETURN_TRUE;
} }
free(create_args);
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
@@ -222,6 +226,7 @@ Container_get_cgroup_item(Container *self, PyObject *args, PyObject *kwds)
static char *kwlist[] = {"key", NULL}; static char *kwlist[] = {"key", NULL};
char* key = NULL; char* key = NULL;
int len = 0; int len = 0;
PyObject *ret = NULL;
if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist, if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist,
&key)) &key))
@@ -235,10 +240,13 @@ Container_get_cgroup_item(Container *self, PyObject *args, PyObject *kwds)
char* value = (char*) malloc(sizeof(char)*len + 1); char* value = (char*) malloc(sizeof(char)*len + 1);
if (self->container->get_cgroup_item(self->container, key, value, len + 1) != len) { if (self->container->get_cgroup_item(self->container, key, value, len + 1) != len) {
free(value);
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
return PyUnicode_FromString(value); ret = PyUnicode_FromString(value);
free(value);
return ret;
} }
static PyObject * static PyObject *
@@ -247,6 +255,7 @@ Container_get_config_item(Container *self, PyObject *args, PyObject *kwds)
static char *kwlist[] = {"key", NULL}; static char *kwlist[] = {"key", NULL};
char* key = NULL; char* key = NULL;
int len = 0; int len = 0;
PyObject *ret = NULL;
if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist, if (! PyArg_ParseTupleAndKeywords(args, kwds, "s|", kwlist,
&key)) &key))
@@ -260,10 +269,13 @@ Container_get_config_item(Container *self, PyObject *args, PyObject *kwds)
char* value = (char*) malloc(sizeof(char)*len + 1); char* value = (char*) malloc(sizeof(char)*len + 1);
if (self->container->get_config_item(self->container, key, value, len + 1) != len) { if (self->container->get_config_item(self->container, key, value, len + 1) != len) {
free(value);
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
return PyUnicode_FromString(value); ret = PyUnicode_FromString(value);
free(value);
return ret;
} }
static PyObject * static PyObject *
@@ -278,6 +290,7 @@ Container_get_keys(Container *self, PyObject *args, PyObject *kwds)
static char *kwlist[] = {"key", NULL}; static char *kwlist[] = {"key", NULL};
char* key = NULL; char* key = NULL;
int len = 0; int len = 0;
PyObject *ret = NULL;
if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist, if (! PyArg_ParseTupleAndKeywords(args, kwds, "|s", kwlist,
&key)) &key))
@@ -291,10 +304,13 @@ Container_get_keys(Container *self, PyObject *args, PyObject *kwds)
char* value = (char*) malloc(sizeof(char)*len + 1); char* value = (char*) malloc(sizeof(char)*len + 1);
if (self->container->get_keys(self->container, key, value, len + 1) != len) { if (self->container->get_keys(self->container, key, value, len + 1) != len) {
free(value);
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }
return PyUnicode_FromString(value); ret = PyUnicode_FromString(value);
free(value);
return ret;
} }
static PyObject * static PyObject *
@@ -427,9 +443,11 @@ Container_start(Container *self, PyObject *args, PyObject *kwds)
self->container->want_daemonize(self->container); self->container->want_daemonize(self->container);
if (self->container->start(self->container, init_useinit, init_args)) { if (self->container->start(self->container, init_useinit, init_args)) {
free(init_args);
Py_RETURN_TRUE; Py_RETURN_TRUE;
} }
free(init_args);
Py_RETURN_FALSE; Py_RETURN_FALSE;
} }