RE: [PATCH v2 031/101] fbdev/hyperv_fb: Duplicate video-mode option string

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Thomas Zimmermann <tzimmermann@xxxxxxx> Sent: Thursday, March 9, 2023 8:01 AM
> 
> Assume that the driver does not own the option string or its substrings
> and hence duplicate the option string for the video mode. As the driver
> implements a very simple mode parser in a fairly unstructured way, just
> duplicate the option string and parse the duplicated memory buffer. Free
> the buffer afterwards.
> 
> Done in preparation of constifying the option string and switching the
> driver to struct option_iter.
> 
> Signed-off-by: Thomas Zimmermann <tzimmermann@xxxxxxx>
> ---
>  drivers/video/fbdev/hyperv_fb.c | 18 +++++++++++++-----
>  1 file changed, 13 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/video/fbdev/hyperv_fb.c b/drivers/video/fbdev/hyperv_fb.c
> index 4a6a3303b6b4..edb0555239c6 100644
> --- a/drivers/video/fbdev/hyperv_fb.c
> +++ b/drivers/video/fbdev/hyperv_fb.c
> @@ -903,17 +903,23 @@ static const struct fb_ops hvfb_ops = {
>  static void hvfb_get_option(struct fb_info *info)
>  {
>  	struct hvfb_par *par = info->par;
> -	char *opt = NULL, *p;
> +	char *options = NULL;
> +	char *optbuf, *opt, *p;
>  	uint x = 0, y = 0;
> 
> -	if (fb_get_options(KBUILD_MODNAME, &opt) || !opt || !*opt)
> +	if (fb_get_options(KBUILD_MODNAME, &options) || !options || !*options)
>  		return;
> 
> +	optbuf = kstrdup(options, GFP_KERNEL);
> +	if (!optbuf)
> +		return;
> +	opt = optbuf;
> +
>  	p = strsep(&opt, "x");
>  	if (!*p || kstrtouint(p, 0, &x) ||
>  	    !opt || !*opt || kstrtouint(opt, 0, &y)) {
>  		pr_err("Screen option is invalid: skipped\n");
> -		return;
> +		goto out;
>  	}
> 
>  	if (x < HVFB_WIDTH_MIN || y < HVFB_HEIGHT_MIN ||
> @@ -922,12 +928,14 @@ static void hvfb_get_option(struct fb_info *info)
>  	    (par->synthvid_version == SYNTHVID_VERSION_WIN8 &&
>  	     x * y * screen_depth / 8 > SYNTHVID_FB_SIZE_WIN8)) {
>  		pr_err("Screen resolution option is out of range: skipped\n");
> -		return;
> +		goto out;
>  	}
> 
>  	screen_width = x;
>  	screen_height = y;
> -	return;
> +
> +out:
> +	kfree(optbuf);
>  }
> 
>  /*
> --
> 2.39.2

Reviewed-by: Michael Kelley <mikelley@xxxxxxxxxxxxx>





[Index of Archives]     [Video for Linux]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Tourism]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux