From: Roel Kluin <roel.kluin@gmail.com>
To: Roel Kluin <roel.kluin@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-fbdev-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org, adaplas@gmail.com
Subject: Re: fbcmap: non working tests on unsigned cmap->start
Date: Mon, 27 Apr 2009 13:58:17 +0200 [thread overview]
Message-ID: <49F59DD9.6010903@gmail.com> (raw)
In-Reply-To: <20090426131505.GG7134@sci.fi>
Ville Syrjälä wrote:
> On Sun, Apr 26, 2009 at 02:20:47PM +0200, Roel Kluin wrote:
>> cmap->start is unsigned,
>>> On Thu, Apr 23, 2009 at 01:41:10PM -0700, Andrew Morton wrote:
>>>> argh.
>>>>
>>>> - Perhaps userspace can kill the kernel by sending a "negative"
>>>> `start'. Removing the test will make it even less likely that we'll
>>>> fix this bug.
>>> Shouldn't happen. 'start' is used as the starting index for the hardware
>>> palette, 'start+len-1' is the last index. All drivers should already check
>>> the passed values since the maximum index depends on the display mode.
>>> And I suppose the worst thing that could happen if the driver fails to
>>> check the values would be incorrect colors.
> You would rather need something like
> 'if (start+len > 1 << max(red.len, green.len, blue.len, transp.len))'
what do you mean with `red.len'? is that `info->var.red.length'?
> and a check to make sure that start+len doesn't overflow.
>
> Oh and I guess it should also check that the visual is pseudocolor or
> directcolor.
I am fairly new so please review carefully.
Not yet signed off-by: Roel Kluin <roel.kluin@gmail.com>
---
diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c
index f53b9f1..b34e74e 100644
--- a/drivers/video/fbcmap.c
+++ b/drivers/video/fbcmap.c
@@ -249,6 +249,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info)
{
int rc, size = cmap->len * sizeof(u16);
struct fb_cmap umap;
+ __u32 rgba_max = 0;
memset(&umap, 0, sizeof(struct fb_cmap));
rc = fb_alloc_cmap(&umap, cmap->len, cmap->transp != NULL);
@@ -261,13 +262,27 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info)
rc = -EFAULT;
goto out;
}
+
+ if (cmap->start + cmap->len < cmap->start) {
+ rc = -EINVAL;
+ goto out;
+ }
+
umap.start = cmap->start;
if (!lock_fb_info(info)) {
rc = -ENODEV;
goto out;
}
- if (cmap->start < 0 || (!info->fbops->fb_setcolreg &&
- !info->fbops->fb_setcmap)) {
+
+ rgba_max = max(info->var.red.length, info->var.green.length);
+ rgba_max = max(rgba_max, info->var.blue.length);
+ rgba_max = max(rgba_max, info->var.transp.length);
+
+ if (cmap->start + cmap->len > 1 << rgba_max ||
+ !(info->fbops->fb_setcolreg ||
+ info->fbops->fb_setcmap) ||
+ !(info->fix.visual == FB_VISUAL_PSEUDOCOLOR ||
+ info->fix.visual == FB_VISUAL_TRUECOLOR)) {
rc = -EINVAL;
goto out1;
}
------------------------------------------------------------------------------
Crystal Reports - New Free Runtime and 30 Day Trial
Check out the new simplified licensign option that enables unlimited
royalty-free distribution of the report engine for externally facing
server and web deployment.
http://p.sf.net/sfu/businessobjects
WARNING: multiple messages have this Message-ID (diff)
From: Roel Kluin <roel.kluin@gmail.com>
To: Roel Kluin <roel.kluin@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
linux-fbdev-devel@lists.sourceforge.net,
linux-kernel@vger.kernel.org, adaplas@gmail.com
Subject: Re: [Linux-fbdev-devel] fbcmap: non working tests on unsigned cmap->start
Date: Mon, 27 Apr 2009 13:58:17 +0200 [thread overview]
Message-ID: <49F59DD9.6010903@gmail.com> (raw)
In-Reply-To: <20090426131505.GG7134@sci.fi>
Ville Syrjälä wrote:
> On Sun, Apr 26, 2009 at 02:20:47PM +0200, Roel Kluin wrote:
>> cmap->start is unsigned,
>>> On Thu, Apr 23, 2009 at 01:41:10PM -0700, Andrew Morton wrote:
>>>> argh.
>>>>
>>>> - Perhaps userspace can kill the kernel by sending a "negative"
>>>> `start'. Removing the test will make it even less likely that we'll
>>>> fix this bug.
>>> Shouldn't happen. 'start' is used as the starting index for the hardware
>>> palette, 'start+len-1' is the last index. All drivers should already check
>>> the passed values since the maximum index depends on the display mode.
>>> And I suppose the worst thing that could happen if the driver fails to
>>> check the values would be incorrect colors.
> You would rather need something like
> 'if (start+len > 1 << max(red.len, green.len, blue.len, transp.len))'
what do you mean with `red.len'? is that `info->var.red.length'?
> and a check to make sure that start+len doesn't overflow.
>
> Oh and I guess it should also check that the visual is pseudocolor or
> directcolor.
I am fairly new so please review carefully.
Not yet signed off-by: Roel Kluin <roel.kluin@gmail.com>
---
diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c
index f53b9f1..b34e74e 100644
--- a/drivers/video/fbcmap.c
+++ b/drivers/video/fbcmap.c
@@ -249,6 +249,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info)
{
int rc, size = cmap->len * sizeof(u16);
struct fb_cmap umap;
+ __u32 rgba_max = 0;
memset(&umap, 0, sizeof(struct fb_cmap));
rc = fb_alloc_cmap(&umap, cmap->len, cmap->transp != NULL);
@@ -261,13 +262,27 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info)
rc = -EFAULT;
goto out;
}
+
+ if (cmap->start + cmap->len < cmap->start) {
+ rc = -EINVAL;
+ goto out;
+ }
+
umap.start = cmap->start;
if (!lock_fb_info(info)) {
rc = -ENODEV;
goto out;
}
- if (cmap->start < 0 || (!info->fbops->fb_setcolreg &&
- !info->fbops->fb_setcmap)) {
+
+ rgba_max = max(info->var.red.length, info->var.green.length);
+ rgba_max = max(rgba_max, info->var.blue.length);
+ rgba_max = max(rgba_max, info->var.transp.length);
+
+ if (cmap->start + cmap->len > 1 << rgba_max ||
+ !(info->fbops->fb_setcolreg ||
+ info->fbops->fb_setcmap) ||
+ !(info->fix.visual == FB_VISUAL_PSEUDOCOLOR ||
+ info->fix.visual == FB_VISUAL_TRUECOLOR)) {
rc = -EINVAL;
goto out1;
}
next prev parent reply other threads:[~2009-04-27 11:58 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-21 14:26 fbcmap: non working tests on unsigned cmap->start Roel Kluin
2009-04-23 20:41 ` Andrew Morton
2009-04-23 21:47 ` [Linux-fbdev-devel] " Ville Syrjälä
2009-04-23 21:56 ` Andrew Morton
2009-04-26 12:20 ` Roel Kluin
2009-04-26 12:20 ` [Linux-fbdev-devel] " Roel Kluin
2009-04-26 13:15 ` Ville Syrjälä
2009-04-26 13:15 ` [Linux-fbdev-devel] " Ville Syrjälä
2009-04-27 11:58 ` Roel Kluin [this message]
2009-04-27 11:58 ` Roel Kluin
2009-04-27 12:21 ` Geert Uytterhoeven
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=49F59DD9.6010903@gmail.com \
--to=roel.kluin@gmail.com \
--cc=adaplas@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=linux-fbdev-devel@lists.sourceforge.net \
--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: link
Be 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.