V4L/DVB (10558): bttv: norm value should be unsigned
authorTrent Piepho <xyzzy@speakeasy.org>
Thu, 29 Jan 2009 00:32:58 +0000 (21:32 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 30 Mar 2009 15:42:46 +0000 (12:42 -0300)
The norm value in the driver is an index into an array and the the driver
doesn't allow it to be negative or otherwise invalid.  It should be
unsigned but wasn't in all places.

Fix some structs and functions to have the norm be unsigned.  Get rid of
useless checks for "< 0".  Most of the driver code can't handle a norm
value that's out of range, so change some ">= BTTV_TVNORMS" checks to
BUG_ON().  There's no point in silently ignoring invalid driver state just
to crash because of it later.

Reported-by: Roel Kluin <roel.kluin@gmail.com>
Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/bt8xx/bttv-cards.c
drivers/media/video/bt8xx/bttv-driver.c
drivers/media/video/bt8xx/bttv-vbi.c
drivers/media/video/bt8xx/bttv.h
drivers/media/video/bt8xx/bttvp.h

index 9dfd8c70e4fb058e2b162f5893fb59f2164d730f..2df0ce2afe980692f7b3cdf952a95a900b9e72e6 100644 (file)
@@ -4085,7 +4085,7 @@ static void __devinit avermedia_eeprom(struct bttv *btv)
 }
 
 /* used on Voodoo TV/FM (Voodoo 200), S0 wired to 0x10000 */
-void bttv_tda9880_setnorm(struct bttv *btv, int norm)
+void bttv_tda9880_setnorm(struct bttv *btv, unsigned int norm)
 {
        /* fix up our card entry */
        if(norm==V4L2_STD_NTSC) {
index c71f394fc0ead807e04b166b2a300c4bf2978326..4ec476a9c0e43147bf7a0a91a7d5a0c567853c2e 100644 (file)
@@ -1277,7 +1277,7 @@ bttv_crop_calc_limits(struct bttv_crop *c)
 }
 
 static void
-bttv_crop_reset(struct bttv_crop *c, int norm)
+bttv_crop_reset(struct bttv_crop *c, unsigned int norm)
 {
        c->rect = bttv_tvnorms[norm].cropcap.defrect;
        bttv_crop_calc_limits(c);
@@ -1290,16 +1290,13 @@ set_tvnorm(struct bttv *btv, unsigned int norm)
        const struct bttv_tvnorm *tvnorm;
        v4l2_std_id id;
 
-       if (norm < 0 || norm >= BTTV_TVNORMS)
-               return -EINVAL;
+       BUG_ON(norm >= BTTV_TVNORMS);
+       BUG_ON(btv->tvnorm >= BTTV_TVNORMS);
 
        tvnorm = &bttv_tvnorms[norm];
 
-       if (btv->tvnorm < 0 ||
-           btv->tvnorm >= BTTV_TVNORMS ||
-           0 != memcmp(&bttv_tvnorms[btv->tvnorm].cropcap,
-                       &tvnorm->cropcap,
-                       sizeof (tvnorm->cropcap))) {
+       if (!memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
+                   sizeof (tvnorm->cropcap))) {
                bttv_crop_reset(&btv->crop[0], norm);
                btv->crop[1] = btv->crop[0]; /* current = default */
 
index 6819e21a3773ea747a7ef8e5762076d097f9d008..e79a402fa6cd576897f042c44b75a5e0985fe386 100644 (file)
@@ -411,7 +411,7 @@ int bttv_g_fmt_vbi_cap(struct file *file, void *f, struct v4l2_format *frt)
        return 0;
 }
 
-void bttv_vbi_fmt_reset(struct bttv_vbi_fmt *f, int norm)
+void bttv_vbi_fmt_reset(struct bttv_vbi_fmt *f, unsigned int norm)
 {
        const struct bttv_tvnorm *tvnorm;
        unsigned int real_samples_per_line;
index a7bcad17182307178ec31f3fd831109c27036fb9..b1986b94d29fe4e9d42fae9037a51acf23caa68a 100644 (file)
@@ -265,7 +265,7 @@ extern void bttv_init_card2(struct bttv *btv);
 
 /* card-specific funtions */
 extern void tea5757_set_freq(struct bttv *btv, unsigned short freq);
-extern void bttv_tda9880_setnorm(struct bttv *btv, int norm);
+extern void bttv_tda9880_setnorm(struct bttv *btv, unsigned int norm);
 
 /* extra tweaks for some chipsets */
 extern void bttv_check_chipset(void);
index 199a4d225caf6f4ec534b6477077b2280564d3fa..230e148e78fed2a577fdf424946f45d5f53d6f40 100644 (file)
@@ -135,7 +135,7 @@ struct bttv_buffer {
 
        /* bttv specific */
        const struct bttv_format   *fmt;
-       int                        tvnorm;
+       unsigned int               tvnorm;
        int                        btformat;
        int                        btswap;
        struct bttv_geometry       geo;
@@ -154,7 +154,7 @@ struct bttv_buffer_set {
 };
 
 struct bttv_overlay {
-       int                    tvnorm;
+       unsigned int           tvnorm;
        struct v4l2_rect       w;
        enum v4l2_field        field;
        struct v4l2_clip       *clips;
@@ -174,7 +174,7 @@ struct bttv_vbi_fmt {
 };
 
 /* bttv-vbi.c */
-void bttv_vbi_fmt_reset(struct bttv_vbi_fmt *f, int norm);
+void bttv_vbi_fmt_reset(struct bttv_vbi_fmt *f, unsigned int norm);
 
 struct bttv_crop {
        /* A cropping rectangle in struct bttv_tvnorm.cropcap units. */
@@ -378,7 +378,8 @@ struct bttv {
        unsigned int audio;
        unsigned int mute;
        unsigned long freq;
-       int tvnorm,hue,contrast,bright,saturation;
+       unsigned int tvnorm;
+       int hue, contrast, bright, saturation;
        struct v4l2_framebuffer fbuf;
        unsigned int field_count;