On 15.03.2024 11:58, Carlo Nonato wrote:
> @@ -219,6 +220,39 @@ void domain_llc_coloring_free(struct domain *d)
> xfree(__va(__pa(d->llc_colors)));
> }
>
> +int domain_set_llc_colors(struct domain *d,
> + const struct xen_domctl_set_llc_colors *config)
> +{
> + unsigned int *colors;
> +
> + if ( d->num_llc_colors )
> + return -EEXIST;
> +
> + if ( !config->num_llc_colors )
> + return domain_set_default_colors(d);
> +
> + if ( config->num_llc_colors > max_nr_colors || config->pad )
The check of "pad" wants carrying out in all cases; I expect it wants
moving to the caller.
> + return -EINVAL;
> +
> + colors = xmalloc_array(unsigned int, config->num_llc_colors);
> + if ( !colors )
> + return -ENOMEM;
> +
> + if ( copy_from_guest(colors, config->llc_colors, config->num_llc_colors)
> )
> + return -EFAULT;
You're leaking "colors" when taking this or ...
> + if ( !check_colors(colors, config->num_llc_colors) )
> + {
> + printk(XENLOG_ERR "Bad LLC color config for %pd\n", d);
> + return -EINVAL;
... this error path.
Jan