Peter Xu <pet...@redhat.com> writes:

> On Mon, Jun 30, 2025 at 04:59:10PM -0300, Fabiano Rosas wrote:
>> The documentation of qobject_from_jsonv() states that it takes
>> ownership of any %p arguments passed in.
>> 
>> Next patches will add config-passing to the tests, so take an extra
>> reference in the migrate_qmp* functions to ensure the config is not
>> freed from under us.
>> 
>> Signed-off-by: Fabiano Rosas <faro...@suse.de>
>> ---
>>  tests/qtest/migration/migration-qmp.c | 8 +++++---
>>  1 file changed, 5 insertions(+), 3 deletions(-)
>> 
>> diff --git a/tests/qtest/migration/migration-qmp.c 
>> b/tests/qtest/migration/migration-qmp.c
>> index fb59741b2c..d82ac8c750 100644
>> --- a/tests/qtest/migration/migration-qmp.c
>> +++ b/tests/qtest/migration/migration-qmp.c
>> @@ -97,7 +97,8 @@ void migrate_qmp_fail(QTestState *who, const char *uri,
>>      }
>>  
>>      err = qtest_qmp_assert_failure_ref(
>> -        who, "{ 'execute': 'migrate', 'arguments': %p}", args);
>> +        who, "{ 'execute': 'migrate', 'arguments': %p}",
>> +        qdict_clone_shallow(args));
>>  
>>      g_assert(qdict_haskey(err, "desc"));
>>  
>> @@ -136,7 +137,8 @@ void migrate_qmp(QTestState *who, QTestState *to, const 
>> char *uri,
>>      }
>>  
>>      qtest_qmp_assert_success(who,
>> -                             "{ 'execute': 'migrate', 'arguments': %p}", 
>> args);
>> +                             "{ 'execute': 'migrate', 'arguments': %p}",
>> +                             qdict_clone_shallow(args));
>>  }
>>  
>>  void migrate_set_capability(QTestState *who, const char *capability,
>> @@ -174,7 +176,7 @@ void migrate_incoming_qmp(QTestState *to, const char 
>> *uri, QObject *channels,
>>      migrate_set_capability(to, "events", true);
>>  
>>      rsp = qtest_qmp(to, "{ 'execute': 'migrate-incoming', 'arguments': %p}",
>> -                    args);
>> +                    qdict_clone_shallow(args));
>
> Isn't it intentional to pass over the ownership in the three places here?
> I don't see otherwise where args got freed.
>

Hmm, I think I remember the issue being that qobject_from_jsonv() freed
before the object it reached QMP, so indeed this needs to be freed
before the migrate_qmp functions return.

I don't really understand why ASAN didn't spot it though. I'll fix, thanks!

> OTOH, I saw there're yet another three similar usages of %p in framework.c:
>
> x1:migration [migration-params-caps-no-config]$ git grep -A1 %p framework.c
> framework.c:        migrate_qmp_fail(from, args->connect_uri, NULL, "{ 
> 'config': %p }",
> framework.c-                         args->start.config);
> --
> framework.c:    migrate_qmp(from, to, args->connect_uri, NULL, "{ 'config': 
> %p }",
> framework.c-                args->start.config);
> --
> framework.c:    migrate_incoming_qmp(to, args->connect_uri, NULL, "{ 
> 'config': %p }",
> framework.c-                         args->start.config);
>
> They seem to be suspecious instead, as they seem to have lost ownership of
> args->start.config, so args->start.config can start to point to garbage?
>



>>  
>>      if (!qdict_haskey(rsp, "return")) {
>>          g_autoptr(GString) s = qobject_to_json_pretty(QOBJECT(rsp), true);
>> -- 
>> 2.35.3
>> 

Reply via email to