On 02.05.2024 18:55, Carlo Nonato wrote: > @@ -266,6 +267,47 @@ int domain_set_llc_colors(struct domain *d, > return 0; > } > > +int __init domain_set_llc_colors_from_str(struct domain *d, const char *str) > +{ > + int err; > + unsigned int *colors, num_colors; > + > + if ( !str ) > + { > + domain_set_default_colors(d); > + return 0; > + } > + > + colors = xmalloc_array(unsigned int, max_nr_colors); > + if ( !colors ) > + return -ENOMEM; > + > + err = parse_color_config(str, colors, max_nr_colors, &num_colors); > + if ( err ) > + { > + printk(XENLOG_ERR "Error parsing LLC color configuration"); > + xfree(colors); > + return err; > + } > + > + if ( !check_colors(colors, num_colors) ) > + { > + printk(XENLOG_ERR "Bad LLC color config for %pd\n", d); > + xfree(colors); > + return -EINVAL; > + } > + > + /* Adjust the size cause it was initially set to max_nr_colors */ > + colors = xrealloc_array(colors, num_colors); > + if ( !colors ) > + return -ENOMEM;
In the error case you're leaking the (too large) array. IMO you want this to be best effort anyway - try to shrink, but if shrinking fails use what you already have: d->llc_colors = xrealloc_array(colors, num_colors); if ( !d->llc_colors ) d->llc_colors = colors; Jan