From: Jani Nikula <jani.nikula@linux.intel.com> To: LABBE Corentin <clabbe.montjoie@gmail.com>, airlied@linux.ie Cc: LABBE Corentin <clabbe.montjoie@gmail.com>, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: Re: [PATCH v2 1/1] drm: modes: fix DRM modes analysis regression Date: Wed, 09 Dec 2015 17:32:05 +0200 [thread overview] Message-ID: <871tavwscq.fsf@intel.com> (raw) In-Reply-To: <1449667811-24472-2-git-send-email-clabbe.montjoie@gmail.com> On Wed, 09 Dec 2015, LABBE Corentin <clabbe.montjoie@gmail.com> wrote: > My latest commit introduce some case where a valid mode, could be > rejected. > simple_strtox functions stop at first non-digit character, but kstrtox not. > So args like "video=HDMI-A-1:720x480-16@60" will be reject when checking 16@. > The proper solution is to store digits in a specific buffer. Or to revert regressing commit...? Your original commit complicated the already complicated function, and this one makes it more so. What is the benefit? > Fixes: 52157a4ca396 ("drm: modes: replace simple_strtoul by kstrtouint") For me the commit id is cc344980c76748e57c9c03100c2a14d36ab00334. BR, Jani. > Reported-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> > Signed-off-by: LABBE Corentin <clabbe.montjoie@gmail.com> > --- > drivers/gpu/drm/drm_modes.c | 28 +++++++++++++++++++++------- > 1 file changed, 21 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index bde9b29..da1e80d 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -1225,13 +1225,14 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, > struct drm_cmdline_mode *mode) > { > const char *name; > - unsigned int namelen; > + unsigned int namelen, digit_i; > bool res_specified = false, bpp_specified = false, refresh_specified = false; > unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0; > bool yres_specified = false, cvt = false, rb = false; > bool interlace = false, margins = false, was_digit = false; > int i, err; > enum drm_connector_force force = DRM_FORCE_UNSPECIFIED; > + char *digits; > > #ifdef CONFIG_FB > if (!mode_option) > @@ -1245,42 +1246,53 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, > > name = mode_option; > namelen = strlen(name); > + > + digits = kzalloc(namelen, GFP_KERNEL); > + if (!digits) > + return false; > + /* The last character must be the last 0 */ > + digit_i = namelen; > + > for (i = namelen-1; i >= 0; i--) { > switch (name[i]) { > case '@': > if (!refresh_specified && !bpp_specified && > !yres_specified && !cvt && !rb && was_digit) { > - err = kstrtouint(&name[i + 1], 10, &refresh); > + err = kstrtouint(&digits[digit_i], 10, &refresh); > if (err) > - return false; > + goto done; > refresh_specified = true; > was_digit = false; > + digit_i = namelen; > } else > goto done; > break; > case '-': > if (!bpp_specified && !yres_specified && !cvt && > !rb && was_digit) { > - err = kstrtouint(&name[i + 1], 10, &bpp); > + err = kstrtouint(&digits[digit_i], 10, &bpp); > if (err) > - return false; > + goto done; > bpp_specified = true; > was_digit = false; > + digit_i = namelen; > } else > goto done; > break; > case 'x': > if (!yres_specified && was_digit) { > - err = kstrtouint(&name[i + 1], 10, &yres); > + err = kstrtouint(&digits[digit_i], 10, &yres); > if (err) > - return false; > + goto done; > yres_specified = true; > was_digit = false; > + digit_i = namelen; > } else > goto done; > break; > case '0' ... '9': > was_digit = true; > + digits[--digit_i] = name[i]; > break; > case 'M': > if (yres_specified || cvt || was_digit) > @@ -1349,6 +1361,7 @@ done: > "parse error at position %i in video mode '%s'\n", > i, name); > mode->specified = false; > + kfree(digits); > return false; > } > > @@ -1373,6 +1386,7 @@ done: > mode->margins = margins; > mode->force = force; > > + kfree(digits); > return true; > } > EXPORT_SYMBOL(drm_mode_parse_command_line_for_connector); -- Jani Nikula, Intel Open Source Technology Center
WARNING: multiple messages have this Message-ID (diff)
From: Jani Nikula <jani.nikula@linux.intel.com> To: airlied@linux.ie Cc: LABBE Corentin <clabbe.montjoie@gmail.com>, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org Subject: Re: [PATCH v2 1/1] drm: modes: fix DRM modes analysis regression Date: Wed, 09 Dec 2015 17:32:05 +0200 [thread overview] Message-ID: <871tavwscq.fsf@intel.com> (raw) In-Reply-To: <1449667811-24472-2-git-send-email-clabbe.montjoie@gmail.com> On Wed, 09 Dec 2015, LABBE Corentin <clabbe.montjoie@gmail.com> wrote: > My latest commit introduce some case where a valid mode, could be > rejected. > simple_strtox functions stop at first non-digit character, but kstrtox not. > So args like "video=HDMI-A-1:720x480-16@60" will be reject when checking 16@. > The proper solution is to store digits in a specific buffer. Or to revert regressing commit...? Your original commit complicated the already complicated function, and this one makes it more so. What is the benefit? > Fixes: 52157a4ca396 ("drm: modes: replace simple_strtoul by kstrtouint") For me the commit id is cc344980c76748e57c9c03100c2a14d36ab00334. BR, Jani. > Reported-by: Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> > Signed-off-by: LABBE Corentin <clabbe.montjoie@gmail.com> > --- > drivers/gpu/drm/drm_modes.c | 28 +++++++++++++++++++++------- > 1 file changed, 21 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/drm_modes.c b/drivers/gpu/drm/drm_modes.c > index bde9b29..da1e80d 100644 > --- a/drivers/gpu/drm/drm_modes.c > +++ b/drivers/gpu/drm/drm_modes.c > @@ -1225,13 +1225,14 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, > struct drm_cmdline_mode *mode) > { > const char *name; > - unsigned int namelen; > + unsigned int namelen, digit_i; > bool res_specified = false, bpp_specified = false, refresh_specified = false; > unsigned int xres = 0, yres = 0, bpp = 32, refresh = 0; > bool yres_specified = false, cvt = false, rb = false; > bool interlace = false, margins = false, was_digit = false; > int i, err; > enum drm_connector_force force = DRM_FORCE_UNSPECIFIED; > + char *digits; > > #ifdef CONFIG_FB > if (!mode_option) > @@ -1245,42 +1246,53 @@ bool drm_mode_parse_command_line_for_connector(const char *mode_option, > > name = mode_option; > namelen = strlen(name); > + > + digits = kzalloc(namelen, GFP_KERNEL); > + if (!digits) > + return false; > + /* The last character must be the last 0 */ > + digit_i = namelen; > + > for (i = namelen-1; i >= 0; i--) { > switch (name[i]) { > case '@': > if (!refresh_specified && !bpp_specified && > !yres_specified && !cvt && !rb && was_digit) { > - err = kstrtouint(&name[i + 1], 10, &refresh); > + err = kstrtouint(&digits[digit_i], 10, &refresh); > if (err) > - return false; > + goto done; > refresh_specified = true; > was_digit = false; > + digit_i = namelen; > } else > goto done; > break; > case '-': > if (!bpp_specified && !yres_specified && !cvt && > !rb && was_digit) { > - err = kstrtouint(&name[i + 1], 10, &bpp); > + err = kstrtouint(&digits[digit_i], 10, &bpp); > if (err) > - return false; > + goto done; > bpp_specified = true; > was_digit = false; > + digit_i = namelen; > } else > goto done; > break; > case 'x': > if (!yres_specified && was_digit) { > - err = kstrtouint(&name[i + 1], 10, &yres); > + err = kstrtouint(&digits[digit_i], 10, &yres); > if (err) > - return false; > + goto done; > yres_specified = true; > was_digit = false; > + digit_i = namelen; > } else > goto done; > break; > case '0' ... '9': > was_digit = true; > + digits[--digit_i] = name[i]; > break; > case 'M': > if (yres_specified || cvt || was_digit) > @@ -1349,6 +1361,7 @@ done: > "parse error at position %i in video mode '%s'\n", > i, name); > mode->specified = false; > + kfree(digits); > return false; > } > > @@ -1373,6 +1386,7 @@ done: > mode->margins = margins; > mode->force = force; > > + kfree(digits); > return true; > } > EXPORT_SYMBOL(drm_mode_parse_command_line_for_connector); -- Jani Nikula, Intel Open Source Technology Center
next prev parent reply other threads:[~2015-12-09 15:32 UTC|newest] Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top 2015-12-09 13:30 [PATCH v2 0/1] drm: modes: fix DRM modes analysis regression LABBE Corentin 2015-12-09 13:30 ` [PATCH v2 1/1] " LABBE Corentin 2015-12-09 15:32 ` Jani Nikula [this message] 2015-12-09 15:32 ` Jani Nikula 2015-12-09 19:11 ` Corentin LABBE 2015-12-09 19:11 ` Corentin LABBE 2015-12-10 8:04 ` Daniel Vetter 2015-12-10 8:04 ` Daniel Vetter
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=871tavwscq.fsf@intel.com \ --to=jani.nikula@linux.intel.com \ --cc=airlied@linux.ie \ --cc=clabbe.montjoie@gmail.com \ --cc=dri-devel@lists.freedesktop.org \ --cc=linux-kernel@vger.kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.