diff options
author | Michael Krufky <mkrufky@linuxtv.org> | 2007-12-29 21:46:01 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-01-25 19:04:34 -0200 |
commit | 33f25b42753f464c5927e8b828352333780c14bd (patch) | |
tree | ccd92d6a0e2996e6f553d6def330ec77fb81593b /drivers/media/dvb/frontends/tda18271-tables.c | |
parent | 0be4375410f1ecc917f3c0caf8f98908d357c93f (diff) |
V4L/DVB (6957): tda18271: fail table lookups if frequency is out of range
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/dvb/frontends/tda18271-tables.c')
-rw-r--r-- | drivers/media/dvb/frontends/tda18271-tables.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/drivers/media/dvb/frontends/tda18271-tables.c b/drivers/media/dvb/frontends/tda18271-tables.c index e10a93bf12c..f8202c40b04 100644 --- a/drivers/media/dvb/frontends/tda18271-tables.c +++ b/drivers/media/dvb/frontends/tda18271-tables.c @@ -273,6 +273,7 @@ int tda18271_lookup_pll_map(enum tda18271_map_type map_type, struct tda18271_pll_map *map = NULL; unsigned int i = 0; char *map_name; + int ret = 0; switch (map_type) { case MAIN_PLL: @@ -291,12 +292,17 @@ int tda18271_lookup_pll_map(enum tda18271_map_type map_type, if (!map) { tda_warn("%s map is not set!\n", map_name); - return -EINVAL; + ret = -EINVAL; + goto fail; } while ((map[i].lomax * 1000) < *freq) { - if (map[i + 1].lomax == 0) + if (map[i].lomax == 0) { + tda_map("%s: frequency (%d) out of range\n", + map_name, *freq); + ret = -ERANGE; break; + } i++; } *post_div = map[i].pd; @@ -304,8 +310,8 @@ int tda18271_lookup_pll_map(enum tda18271_map_type map_type, tda_map("%s: post div = 0x%02x, div = 0x%02x\n", map_name, *post_div, *div); - - return 0; +fail: + return ret; } int tda18271_lookup_map(enum tda18271_map_type map_type, u32 *freq, u8 *val) @@ -313,6 +319,7 @@ int tda18271_lookup_map(enum tda18271_map_type map_type, u32 *freq, u8 *val) struct tda18271_map *map = NULL; unsigned int i = 0; char *map_name; + int ret = 0; switch (map_type) { case BP_FILTER: @@ -347,19 +354,24 @@ int tda18271_lookup_map(enum tda18271_map_type map_type, u32 *freq, u8 *val) if (!map) { tda_warn("%s map is not set!\n", map_name); - return -EINVAL; + ret = -EINVAL; + goto fail; } while ((map[i].rfmax * 1000) < *freq) { - if (map[i + 1].rfmax == 0) + if (map[i].rfmax == 0) { + tda_map("%s: frequency (%d) out of range\n", + map_name, *freq); + ret = -ERANGE; break; + } i++; } *val = map[i].val; tda_map("%s: 0x%02x\n", map_name, *val); - - return 0; +fail: + return ret; } /* |