diff options
author | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-09-22 13:09:18 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@s-opensource.com> | 2016-09-22 13:14:22 -0400 |
commit | 3cc2691227203c00cac1d82d6b0772224d5c87b2 (patch) | |
tree | 5fca5d9d19b039f8937c14b9c2a04ae16e487d37 | |
parent | e837d85c614e8d6e2d93daed972874ea3a8daec7 (diff) |
[media] ttusb_dec: avoid the risk of go past buffer
Fixes this smatch warning:
drivers/media/usb/ttusb-dec/ttusb_dec.c:243 ttusb_dec_handle_irq() error: buffer overflow 'rc_keys' 26 <= 126
As the RC keys should be enabled previously, via:
set_bit(rc_keys[i], input_dev->keybit);
It wouldn't go past the buffer in practice. Yet, as bad
things may happen when going past buffer, it doesn't hurt adding
a check here.
While here, fix CodingStyle issues on the routine.
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
-rw-r--r-- | drivers/media/usb/ttusb-dec/ttusb_dec.c | 30 |
1 files changed, 18 insertions, 12 deletions
diff --git a/drivers/media/usb/ttusb-dec/ttusb_dec.c b/drivers/media/usb/ttusb-dec/ttusb_dec.c index 4e36e24cb3a6..4e7671a3a1e4 100644 --- a/drivers/media/usb/ttusb-dec/ttusb_dec.c +++ b/drivers/media/usb/ttusb-dec/ttusb_dec.c | |||
@@ -206,7 +206,7 @@ static void ttusb_dec_set_model(struct ttusb_dec *dec, | |||
206 | 206 | ||
207 | static void ttusb_dec_handle_irq( struct urb *urb) | 207 | static void ttusb_dec_handle_irq( struct urb *urb) |
208 | { | 208 | { |
209 | struct ttusb_dec * dec = urb->context; | 209 | struct ttusb_dec *dec = urb->context; |
210 | char *buffer = dec->irq_buffer; | 210 | char *buffer = dec->irq_buffer; |
211 | int retval; | 211 | int retval; |
212 | 212 | ||
@@ -227,25 +227,31 @@ static void ttusb_dec_handle_irq( struct urb *urb) | |||
227 | goto exit; | 227 | goto exit; |
228 | } | 228 | } |
229 | 229 | ||
230 | if( (buffer[0] == 0x1) && (buffer[2] == 0x15) ) { | 230 | if ((buffer[0] == 0x1) && (buffer[2] == 0x15)) { |
231 | /* IR - Event */ | 231 | /* |
232 | /* this is an fact a bit too simple implementation; | 232 | * IR - Event |
233 | * | ||
234 | * this is an fact a bit too simple implementation; | ||
233 | * the box also reports a keyrepeat signal | 235 | * the box also reports a keyrepeat signal |
234 | * (with buffer[3] == 0x40) in an intervall of ~100ms. | 236 | * (with buffer[3] == 0x40) in an intervall of ~100ms. |
235 | * But to handle this correctly we had to imlemenent some | 237 | * But to handle this correctly we had to imlemenent some |
236 | * kind of timer which signals a 'key up' event if no | 238 | * kind of timer which signals a 'key up' event if no |
237 | * keyrepeat signal is received for lets say 200ms. | 239 | * keyrepeat signal is received for lets say 200ms. |
238 | * this should/could be added later ... | 240 | * this should/could be added later ... |
239 | * for now lets report each signal as a key down and up*/ | 241 | * for now lets report each signal as a key down and up |
240 | dprintk("%s:rc signal:%d\n", __func__, buffer[4]); | 242 | */ |
241 | input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 1); | 243 | if (buffer[4] - 1 < ARRAY_SIZE(rc_keys)) { |
242 | input_sync(dec->rc_input_dev); | 244 | dprintk("%s:rc signal:%d\n", __func__, buffer[4]); |
243 | input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 0); | 245 | input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 1); |
244 | input_sync(dec->rc_input_dev); | 246 | input_sync(dec->rc_input_dev); |
247 | input_report_key(dec->rc_input_dev, rc_keys[buffer[4] - 1], 0); | ||
248 | input_sync(dec->rc_input_dev); | ||
249 | } | ||
245 | } | 250 | } |
246 | 251 | ||
247 | exit: retval = usb_submit_urb(urb, GFP_ATOMIC); | 252 | exit: |
248 | if(retval) | 253 | retval = usb_submit_urb(urb, GFP_ATOMIC); |
254 | if (retval) | ||
249 | printk("%s - usb_commit_urb failed with result: %d\n", | 255 | printk("%s - usb_commit_urb failed with result: %d\n", |
250 | __func__, retval); | 256 | __func__, retval); |
251 | } | 257 | } |