On Fri, 3 Oct 2025 at 16:40, Peter Xu <[email protected]> wrote:
>
> From: Steve Sistare <[email protected]>
>
> Create the cpr-exec-command migration parameter, defined as a list of
> strings.  It will be used for cpr-exec migration mode in a subsequent
> patch, and contains forward references to cpr-exec mode in the qapi
> doc.
>
> No functional change, except that cpr-exec-command is shown by the
> 'info migrate' command.

Hi; I was doing a 'git grep' for accidental misuses
of g_autofree on a char** (which will free only the
top level array, not the strings it points to), and
the usage in this commit confused me for a bit:

> +    case MIGRATION_PARAMETER_CPR_EXEC_COMMAND: {
> +        g_autofree char **strv = NULL;

g_shell_parse_argv() documents that we should free the
vector with g_strfreev(), but g_autofree will only
g_free() it. So this looks like a bug, but...

> +        g_autoptr(GError) gerr = NULL;
> +        strList **tail = &p->cpr_exec_command;
> +
> +        if (!g_shell_parse_argv(valuestr, NULL, &strv, &gerr)) {
> +            error_setg(&err, "%s", gerr->message);
> +            break;
> +        }
> +        for (int i = 0; strv[i]; i++) {
> +            QAPI_LIST_APPEND(tail, strv[i]);

...we copy out the pointers to the individual
strings here, and QAPI_LIST_APPEND() doesn't do a
string copy, so it's correct that we don't g_strfreev()
the char**.

Do you think it's worth a brief comment saying why
g_autofree is correct here, or is it obvious enough
without ?

> +        }
> +        p->has_cpr_exec_command = true;
> +        break;
> +    }

thanks
-- PMM

Reply via email to