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