On Thu,  9 May 2013 21:20:57 -0500
Michael Roth <mdr...@linux.vnet.ibm.com> wrote:

> qmp_output_get_qobject() increments the qobject's reference count. Since
> we currently pass this straight into qobject_to_json() so we can feed
> the data into a QMP input visitor, we never actually free the underlying
> qobject when qmp_output_visitor_cleanup() is called. This causes leaks
> on all of the QMP serialization tests.
> 
> Fix this by holding a pointer to the qobject and decref'ing it before
> returning from qmp_deserialize().
> 
> Signed-off-by: Michael Roth <mdr...@linux.vnet.ibm.com>

I've cherry-picked this one into the qmp branch for 1.5.

> ---
>  tests/test-visitor-serialization.c |    9 +++++++--
>  1 file changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/test-visitor-serialization.c 
> b/tests/test-visitor-serialization.c
> index e84926f..8c8adac 100644
> --- a/tests/test-visitor-serialization.c
> +++ b/tests/test-visitor-serialization.c
> @@ -657,11 +657,16 @@ static void qmp_deserialize(void **native_out, void 
> *datap,
>                              VisitorFunc visit, Error **errp)
>  {
>      QmpSerializeData *d = datap;
> -    QString *output_json = qobject_to_json(qmp_output_get_qobject(d->qov));
> -    QObject *obj = qobject_from_json(qstring_get_str(output_json));
> +    QString *output_json;
> +    QObject *obj_orig, *obj;
> +
> +    obj_orig = qmp_output_get_qobject(d->qov);
> +    output_json = qobject_to_json(obj_orig);
> +    obj = qobject_from_json(qstring_get_str(output_json));
>  
>      QDECREF(output_json);
>      d->qiv = qmp_input_visitor_new(obj);
> +    qobject_decref(obj_orig);
>      qobject_decref(obj);
>      visit(qmp_input_get_visitor(d->qiv), native_out, errp);
>  }


Reply via email to