On Mon, 6 Jul 2026 at 23:44, Klaus Jensen <[email protected]> wrote:
>
> From: Alexander Mikhalitsyn <[email protected]>
>
> Let's block migration for cases we don't support:
> - SR-IOV
> - CMB
> - PMR
> - SPDM
>
> No functional changes here, because NVMe migration is
> not supported at all as of this commit.

Hi; Coverity has a complaint about this commit (CID 1663673):

> +#define BLOCKER_FEATURES_MAX_LEN 256
> +
> +static inline void nvme_add_blocker_feature(char *blocker_features,
> +                                            const char *feature)
> +{
> +    if (strlen(blocker_features) > 0) {
> +        g_strlcat(blocker_features, ", ", BLOCKER_FEATURES_MAX_LEN);
> +    }
> +    g_strlcat(blocker_features, feature, BLOCKER_FEATURES_MAX_LEN);

g_strlcat has a return value to tell us whether it managed to fit
all the text in, but we aren't checking it.

In this case it looks like that's not a big deal (it does always NUL
terminate even if it truncates, and we're only using the string
to report migration blockers), but I think it would be nicer to
avoid using a fixed-size char array: they're usually a bit more
bug-prone.

How about we use glib's GPtrArray and g_strjoinv() instead of
manually building the string? Something like:


    g_autoptr(GPtrArray) blocker_features = g_ptr_array_new();

    if (...) {
        g_ptr_array_add(blocker_features, "SR-IOV");
    }
    [etc...]


    if (blocker_features->len > 0) {
        g_autofree blocker_list = NULL;

        g_ptr_array_add(blocker_features, NULL);
        blocker_list = g_strjoinv(", ", (void *)blocker_features->pdata);
        error_setg(&n->migration_blocker,
                   "Migration is not supported for %s", blocker_list);
        if (migrate_add_blocker(&n->migration_blocker, errp) < 0) {
            return false;
        }
    }

thanks
-- PMM

Reply via email to