Commit 4ef2ccc2 authored by Trent Piepho's avatar Trent Piepho Committed by Mauro Carvalho Chehab

V4L/DVB (10558): bttv: norm value should be unsigned

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: default avatarRoel Kluin <roel.kluin@gmail.com>
Signed-off-by: default avatarTrent Piepho <xyzzy@speakeasy.org>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 1d6af821
...@@ -4085,7 +4085,7 @@ static void __devinit avermedia_eeprom(struct bttv *btv) ...@@ -4085,7 +4085,7 @@ static void __devinit avermedia_eeprom(struct bttv *btv)
} }
/* used on Voodoo TV/FM (Voodoo 200), S0 wired to 0x10000 */ /* 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 */ /* fix up our card entry */
if(norm==V4L2_STD_NTSC) { if(norm==V4L2_STD_NTSC) {
......
...@@ -1277,7 +1277,7 @@ bttv_crop_calc_limits(struct bttv_crop *c) ...@@ -1277,7 +1277,7 @@ bttv_crop_calc_limits(struct bttv_crop *c)
} }
static void 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; c->rect = bttv_tvnorms[norm].cropcap.defrect;
bttv_crop_calc_limits(c); bttv_crop_calc_limits(c);
...@@ -1290,16 +1290,13 @@ set_tvnorm(struct bttv *btv, unsigned int norm) ...@@ -1290,16 +1290,13 @@ set_tvnorm(struct bttv *btv, unsigned int norm)
const struct bttv_tvnorm *tvnorm; const struct bttv_tvnorm *tvnorm;
v4l2_std_id id; v4l2_std_id id;
if (norm < 0 || norm >= BTTV_TVNORMS) BUG_ON(norm >= BTTV_TVNORMS);
return -EINVAL; BUG_ON(btv->tvnorm >= BTTV_TVNORMS);
tvnorm = &bttv_tvnorms[norm]; tvnorm = &bttv_tvnorms[norm];
if (btv->tvnorm < 0 || if (!memcmp(&bttv_tvnorms[btv->tvnorm].cropcap, &tvnorm->cropcap,
btv->tvnorm >= BTTV_TVNORMS || sizeof (tvnorm->cropcap))) {
0 != memcmp(&bttv_tvnorms[btv->tvnorm].cropcap,
&tvnorm->cropcap,
sizeof (tvnorm->cropcap))) {
bttv_crop_reset(&btv->crop[0], norm); bttv_crop_reset(&btv->crop[0], norm);
btv->crop[1] = btv->crop[0]; /* current = default */ btv->crop[1] = btv->crop[0]; /* current = default */
......
...@@ -411,7 +411,7 @@ int bttv_g_fmt_vbi_cap(struct file *file, void *f, struct v4l2_format *frt) ...@@ -411,7 +411,7 @@ int bttv_g_fmt_vbi_cap(struct file *file, void *f, struct v4l2_format *frt)
return 0; 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; const struct bttv_tvnorm *tvnorm;
unsigned int real_samples_per_line; unsigned int real_samples_per_line;
......
...@@ -265,7 +265,7 @@ extern void bttv_init_card2(struct bttv *btv); ...@@ -265,7 +265,7 @@ extern void bttv_init_card2(struct bttv *btv);
/* card-specific funtions */ /* card-specific funtions */
extern void tea5757_set_freq(struct bttv *btv, unsigned short freq); 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 */ /* extra tweaks for some chipsets */
extern void bttv_check_chipset(void); extern void bttv_check_chipset(void);
......
...@@ -135,7 +135,7 @@ struct bttv_buffer { ...@@ -135,7 +135,7 @@ struct bttv_buffer {
/* bttv specific */ /* bttv specific */
const struct bttv_format *fmt; const struct bttv_format *fmt;
int tvnorm; unsigned int tvnorm;
int btformat; int btformat;
int btswap; int btswap;
struct bttv_geometry geo; struct bttv_geometry geo;
...@@ -154,7 +154,7 @@ struct bttv_buffer_set { ...@@ -154,7 +154,7 @@ struct bttv_buffer_set {
}; };
struct bttv_overlay { struct bttv_overlay {
int tvnorm; unsigned int tvnorm;
struct v4l2_rect w; struct v4l2_rect w;
enum v4l2_field field; enum v4l2_field field;
struct v4l2_clip *clips; struct v4l2_clip *clips;
...@@ -174,7 +174,7 @@ struct bttv_vbi_fmt { ...@@ -174,7 +174,7 @@ struct bttv_vbi_fmt {
}; };
/* bttv-vbi.c */ /* 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 { struct bttv_crop {
/* A cropping rectangle in struct bttv_tvnorm.cropcap units. */ /* A cropping rectangle in struct bttv_tvnorm.cropcap units. */
...@@ -378,7 +378,8 @@ struct bttv { ...@@ -378,7 +378,8 @@ struct bttv {
unsigned int audio; unsigned int audio;
unsigned int mute; unsigned int mute;
unsigned long freq; unsigned long freq;
int tvnorm,hue,contrast,bright,saturation; unsigned int tvnorm;
int hue, contrast, bright, saturation;
struct v4l2_framebuffer fbuf; struct v4l2_framebuffer fbuf;
unsigned int field_count; unsigned int field_count;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment