qom: Avoid leaking str and bool properties on failure
When object_property_add_str() and object_property_add_bool() fail, they
leak their internal StringProperty and BoolProperty structs. Remember
to free the structs on error.
Luckily this is a low-impact memory leak since most QOM properties are
static qdev properties that will never take the error case.
object_property_add() only fails if the property name is already in use.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Cc: qemu-stable@nongnu.org
Signed-off-by: Andreas Färber <afaerber@suse.de>
(cherry picked from commit a01aedc8d3
)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
This commit is contained in:
parent
4f577e9e69
commit
7e42cd6f35
14
qom/object.c
14
qom/object.c
|
@ -1273,6 +1273,7 @@ void object_property_add_str(Object *obj, const char *name,
|
||||||
void (*set)(Object *, const char *, Error **),
|
void (*set)(Object *, const char *, Error **),
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
Error *local_err = NULL;
|
||||||
StringProperty *prop = g_malloc0(sizeof(*prop));
|
StringProperty *prop = g_malloc0(sizeof(*prop));
|
||||||
|
|
||||||
prop->get = get;
|
prop->get = get;
|
||||||
|
@ -1282,7 +1283,11 @@ void object_property_add_str(Object *obj, const char *name,
|
||||||
get ? property_get_str : NULL,
|
get ? property_get_str : NULL,
|
||||||
set ? property_set_str : NULL,
|
set ? property_set_str : NULL,
|
||||||
property_release_str,
|
property_release_str,
|
||||||
prop, errp);
|
prop, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
g_free(prop);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct BoolProperty
|
typedef struct BoolProperty
|
||||||
|
@ -1329,6 +1334,7 @@ void object_property_add_bool(Object *obj, const char *name,
|
||||||
void (*set)(Object *, bool, Error **),
|
void (*set)(Object *, bool, Error **),
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
|
Error *local_err = NULL;
|
||||||
BoolProperty *prop = g_malloc0(sizeof(*prop));
|
BoolProperty *prop = g_malloc0(sizeof(*prop));
|
||||||
|
|
||||||
prop->get = get;
|
prop->get = get;
|
||||||
|
@ -1338,7 +1344,11 @@ void object_property_add_bool(Object *obj, const char *name,
|
||||||
get ? property_get_bool : NULL,
|
get ? property_get_bool : NULL,
|
||||||
set ? property_set_bool : NULL,
|
set ? property_set_bool : NULL,
|
||||||
property_release_bool,
|
property_release_bool,
|
||||||
prop, errp);
|
prop, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
g_free(prop);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *qdev_get_type(Object *obj, Error **errp)
|
static char *qdev_get_type(Object *obj, Error **errp)
|
||||||
|
|
Loading…
Reference in New Issue