Prasad Pandit <[email protected]> writes:

> On Fri, 23 Jan 2026 at 17:51, Fabiano Rosas <[email protected]> wrote:
>> >> diff --git a/migration/options.c b/migration/options.c
>> >> index 9a5a39c886..9dc44a3736 100644
>> >> --- a/migration/options.c
>> >> +++ b/migration/options.c
>> >> @@ -225,6 +225,7 @@ static void get_StrOrNull(Object *obj, Visitor *v, 
>> >> const char *name,
>> >>          str_or_null = g_new0(StrOrNull, 1);
>> >>          str_or_null->type = QTYPE_QSTRING;
>> >>          str_or_null->u.s = g_strdup("");                 <== [1]
>> >> +        *ptr = str_or_null;
>> >>      } else {
>> >>          /* the setter doesn't allow QNULL */
>> >>          assert(str_or_null->type != QTYPE_QNULL);
>> >> @@ -245,6 +246,7 @@ static void set_StrOrNull(Object *obj, Visitor *v, 
>> >> const char *name,
>> >>       */
>> >>      str_or_null->type = QTYPE_QSTRING;
>> >
>> > * Do we need to add:  str_or_null->u.s = g_strdup("");  here?
>>
>> It would leak, the visitor will allocate new memory for it below.
>
> * Then do we need to remove it from get_StrOrNull()?  <== [1] above.
>

The visitor behaves differently depending on the direction
(input/output), the getter is providing a new object with a default
empty string.

>> I'd rather leave to the caller. The errp will be set, I think it's
>> enough. Looking at the other instances of visit_type_str in qdev, they
>> all simply return without any handling. I think in practice it's
>> unlikely that the string visitors will ever set errp because they are
>> just a g_strdup() usually.
>
> * Hmmn, okay. Coverity reported a leak for it in set_StrOrNull(), not
> other places?
>

Well, the setter is slightly different because this property is a
wrapper that contains a string, so the string visitor in the setter can
(in theory) fail and that would indeed leak (the outer object's
memory). But the other properties are returning the string directly,
without any extra memory allocation so, as in this getter, they simply
return on (the theoretical) failure.

IOW, there is nothing to leak in the other setters and the other
getters, on failure leave the caller to deal with the memory that was
already allocated.

Now, I just double-checked and what I said in the previous email is not
entirely accurate:

  "I think in practice it's unlikely that the string visitors will ever
  set errp because they are just a g_strdup() usually." -- me

the input visitor can actually set errp, but it does so before
allocating the string.

> Thank you.
> ---
>   - Prasad

Reply via email to