* fbcmap: non working tests on unsigned cmap->start @ 2009-04-21 14:26 Roel Kluin 2009-04-23 20:41 ` Andrew Morton 0 siblings, 1 reply; 8+ messages in thread From: Roel Kluin @ 2009-04-21 14:26 UTC (permalink / raw) To: adaplas; +Cc: linux-fbdev-devel, lkml vi include/linux/fb.h +478 Note that struct fb_cmap_user cmap->start in fb_set_user_cmap() is unsigned. Should there maybe be a test: if (cmap->start > MAX || ...) (and what should MAX be then?) Otherwise you may want to apply the cleanup patch below Roel ------------------------------>8-------------8<--------------------------------- Remove redundant tests on unsigned Signed-off-by: Roel Kluin <roel.kluin@gmail.com> --- diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c index f53b9f1..958bf4e 100644 --- a/drivers/video/fbcmap.c +++ b/drivers/video/fbcmap.c @@ -266,8 +266,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) rc = -ENODEV; goto out; } - if (cmap->start < 0 || (!info->fbops->fb_setcolreg && - !info->fbops->fb_setcmap)) { + if (!info->fbops->fb_setcolreg && !info->fbops->fb_setcmap) { rc = -EINVAL; goto out1; } ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: fbcmap: non working tests on unsigned cmap->start 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ä 0 siblings, 1 reply; 8+ messages in thread From: Andrew Morton @ 2009-04-23 20:41 UTC (permalink / raw) To: Roel Kluin; +Cc: adaplas, linux-fbdev-devel, linux-kernel On Tue, 21 Apr 2009 16:26:33 +0200 Roel Kluin <roel.kluin@gmail.com> wrote: > vi include/linux/fb.h +478 > > Note that struct fb_cmap_user cmap->start in fb_set_user_cmap() is unsigned. > Should there maybe be a test: > > if (cmap->start > MAX || ...) > > (and what should MAX be then?) > > Otherwise you may want to apply the cleanup patch below > > Roel > ------------------------------>8-------------8<--------------------------------- > Remove redundant tests on unsigned > > Signed-off-by: Roel Kluin <roel.kluin@gmail.com> > --- > diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c > index f53b9f1..958bf4e 100644 > --- a/drivers/video/fbcmap.c > +++ b/drivers/video/fbcmap.c > @@ -266,8 +266,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) > rc = -ENODEV; > goto out; > } > - if (cmap->start < 0 || (!info->fbops->fb_setcolreg && > - !info->fbops->fb_setcmap)) { > + if (!info->fbops->fb_setcolreg && !info->fbops->fb_setcmap) { > rc = -EINVAL; > goto out1; > } 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. - If this bug doesn't exist, and there _is_ userspace which is legitimately sending in "negative" values of `start' (unlikely?) then we will break userspace if we fix this comparison. IOW, I don't have enough knowledge about this code to be able to know what to do. ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Linux-fbdev-devel] fbcmap: non working tests on unsigned cmap->start 2009-04-23 20:41 ` Andrew Morton @ 2009-04-23 21:47 ` Ville Syrjälä 2009-04-23 21:56 ` Andrew Morton 2009-04-26 12:20 ` Roel Kluin 0 siblings, 2 replies; 8+ messages in thread From: Ville Syrjälä @ 2009-04-23 21:47 UTC (permalink / raw) To: Andrew Morton; +Cc: Roel Kluin, linux-fbdev-devel, linux-kernel, adaplas On Thu, Apr 23, 2009 at 01:41:10PM -0700, Andrew Morton wrote: > On Tue, 21 Apr 2009 16:26:33 +0200 > Roel Kluin <roel.kluin@gmail.com> wrote: > > > vi include/linux/fb.h +478 > > > > Note that struct fb_cmap_user cmap->start in fb_set_user_cmap() is unsigned. > > Should there maybe be a test: > > > > if (cmap->start > MAX || ...) > > > > (and what should MAX be then?) > > > > Otherwise you may want to apply the cleanup patch below > > > > Roel > > ------------------------------>8-------------8<--------------------------------- > > Remove redundant tests on unsigned > > > > Signed-off-by: Roel Kluin <roel.kluin@gmail.com> > > --- > > diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c > > index f53b9f1..958bf4e 100644 > > --- a/drivers/video/fbcmap.c > > +++ b/drivers/video/fbcmap.c > > @@ -266,8 +266,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) > > rc = -ENODEV; > > goto out; > > } > > - if (cmap->start < 0 || (!info->fbops->fb_setcolreg && > > - !info->fbops->fb_setcmap)) { > > + if (!info->fbops->fb_setcolreg && !info->fbops->fb_setcmap) { > > rc = -EINVAL; > > goto out1; > > } > > 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. > - If this bug doesn't exist, and there _is_ userspace which is > legitimately sending in "negative" values of `start' (unlikely?) then > we will break userspace if we fix this comparison. The comparison will always be false since 'start' is unsigned so how would anything break? -- Ville Syrjälä syrjala@sci.fi http://www.sci.fi/~syrjala/ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [Linux-fbdev-devel] fbcmap: non working tests on unsigned cmap->start 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 1 sibling, 0 replies; 8+ messages in thread From: Andrew Morton @ 2009-04-23 21:56 UTC (permalink / raw) To: Ville Syrjälä Cc: roel.kluin, linux-fbdev-devel, linux-kernel, adaplas On Fri, 24 Apr 2009 00:47:38 +0300 Ville Syrj__l__ <syrjala@sci.fi> wrote: > On Thu, Apr 23, 2009 at 01:41:10PM -0700, Andrew Morton wrote: > > On Tue, 21 Apr 2009 16:26:33 +0200 > > Roel Kluin <roel.kluin@gmail.com> wrote: > > > > > vi include/linux/fb.h +478 > > > > > > Note that struct fb_cmap_user cmap->start in fb_set_user_cmap() is unsigned. > > > Should there maybe be a test: > > > > > > if (cmap->start > MAX || ...) > > > > > > (and what should MAX be then?) > > > > > > Otherwise you may want to apply the cleanup patch below > > > > > > Roel > > > ------------------------------>8-------------8<--------------------------------- > > > Remove redundant tests on unsigned > > > > > > Signed-off-by: Roel Kluin <roel.kluin@gmail.com> > > > --- > > > diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c > > > index f53b9f1..958bf4e 100644 > > > --- a/drivers/video/fbcmap.c > > > +++ b/drivers/video/fbcmap.c > > > @@ -266,8 +266,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) > > > rc = -ENODEV; > > > goto out; > > > } > > > - if (cmap->start < 0 || (!info->fbops->fb_setcolreg && > > > - !info->fbops->fb_setcmap)) { > > > + if (!info->fbops->fb_setcolreg && !info->fbops->fb_setcmap) { > > > rc = -EINVAL; > > > goto out1; > > > } > > > > 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. OK. I wonder if all drivers _do_ check. It probably doesn't matter much, as it's a privileged operation (I assume?) > > - If this bug doesn't exist, and there _is_ userspace which is > > legitimately sending in "negative" values of `start' (unlikely?) then > > we will break userspace if we fix this comparison. > > The comparison will always be false since 'start' is unsigned so how > would anything break? By "fix this comparison" I meant converting it to if ((signed)cmap->start < 0) ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: fbcmap: non working tests on unsigned cmap->start 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 13:15 ` Ville Syrjälä 1 sibling, 1 reply; 8+ messages in thread From: Roel Kluin @ 2009-04-26 12:20 UTC (permalink / raw) To: Andrew Morton, Roel Kluin, linux-fbdev-devel, linux-kernel, adaplas cmap->start is unsigned, A negative start could result in incorrect colors. `start' is used as the starting index for the hardware palette, 'start+len-1' is the last index. Signed-off-by: Roel Kluin <roel.kluin@gmail.com> --- >>> vi include/linux/fb.h +478 >>> >>> Note that struct fb_cmap_user cmap->start in fb_set_user_cmap() is unsigned. >>> Should there maybe be a test: >>> >>> if (cmap->start > MAX || ...) >>> >>> (and what should MAX be then?) >>> > 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. Thanks for your explanation, I think this should fix it? diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c index f53b9f1..ea62d87 100644 --- a/drivers/video/fbcmap.c +++ b/drivers/video/fbcmap.c @@ -266,7 +266,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) rc = -ENODEV; goto out; } - if (cmap->start < 0 || (!info->fbops->fb_setcolreg && + if (cmap->start >= cmap->len || (!info->fbops->fb_setcolreg && !info->fbops->fb_setcmap)) { 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 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: fbcmap: non working tests on unsigned cmap->start 2009-04-26 12:20 ` Roel Kluin @ 2009-04-26 13:15 ` Ville Syrjälä 2009-04-27 11:58 ` Roel Kluin 0 siblings, 1 reply; 8+ messages in thread From: Ville Syrjälä @ 2009-04-26 13:15 UTC (permalink / raw) To: Roel Kluin; +Cc: Andrew Morton, linux-fbdev-devel, linux-kernel, adaplas On Sun, Apr 26, 2009 at 02:20:47PM +0200, Roel Kluin wrote: > cmap->start is unsigned, A negative start could result in incorrect > colors. `start' is used as the starting index for the hardware palette, > 'start+len-1' is the last index. > > Signed-off-by: Roel Kluin <roel.kluin@gmail.com> > --- > >>> vi include/linux/fb.h +478 > >>> > >>> Note that struct fb_cmap_user cmap->start in fb_set_user_cmap() is unsigned. > >>> Should there maybe be a test: > >>> > >>> if (cmap->start > MAX || ...) > >>> > >>> (and what should MAX be then?) > >>> > > > 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. > > Thanks for your explanation, I think this should fix it? > > diff --git a/drivers/video/fbcmap.c b/drivers/video/fbcmap.c > index f53b9f1..ea62d87 100644 > --- a/drivers/video/fbcmap.c > +++ b/drivers/video/fbcmap.c > @@ -266,7 +266,7 @@ int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *info) > rc = -ENODEV; > goto out; > } > - if (cmap->start < 0 || (!info->fbops->fb_setcolreg && > + if (cmap->start >= cmap->len || (!info->fbops->fb_setcolreg && > !info->fbops->fb_setcmap)) { > rc = -EINVAL; > goto out1; That's not correct. There's nothing wrong with having 'start' >= 'len'. You would rather need something like 'if (start+len > 1 << max(red.len, green.len, blue.len, transp.len))' 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. -- Ville Syrjälä syrjala@sci.fi http://www.sci.fi/~syrjala/ ------------------------------------------------------------------------------ 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 ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: fbcmap: non working tests on unsigned cmap->start 2009-04-26 13:15 ` Ville Syrjälä @ 2009-04-27 11:58 ` Roel Kluin 2009-04-27 12:21 ` [Linux-fbdev-devel] " Geert Uytterhoeven 0 siblings, 1 reply; 8+ messages in thread From: Roel Kluin @ 2009-04-27 11:58 UTC (permalink / raw) To: Roel Kluin, Andrew Morton, linux-fbdev-devel, linux-kernel, adaplas 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 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [Linux-fbdev-devel] fbcmap: non working tests on unsigned cmap->start 2009-04-27 11:58 ` Roel Kluin @ 2009-04-27 12:21 ` Geert Uytterhoeven 0 siblings, 0 replies; 8+ messages in thread From: Geert Uytterhoeven @ 2009-04-27 12:21 UTC (permalink / raw) To: Roel Kluin; +Cc: Andrew Morton, linux-fbdev-devel, linux-kernel, adaplas On Mon, Apr 27, 2009 at 13:58, Roel Kluin <roel.kluin@gmail.com> wrote: > 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'? That's correct. >> 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> Looks OK, thx! > --- > 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 > _______________________________________________ > Linux-fbdev-devel mailing list > Linux-fbdev-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/linux-fbdev-devel > -- Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2009-04-27 12:21 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 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 13:15 ` Ville Syrjälä 2009-04-27 11:58 ` Roel Kluin 2009-04-27 12:21 ` [Linux-fbdev-devel] " Geert Uytterhoeven
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).