| From: Josh Boyer <jwboyer@redhat.com> |
| Date: Wed, 2 Nov 2011 16:39:58 -0300 |
| Subject: [media] ttusb2: Don't use stack variables for DMA |
| |
| commit ff17999184ed13829bc14c3be412d980173dff40 upstream. |
| |
| The ttusb2_msg function uses on-stack variables to submit commands to |
| dvb_usb_generic. This eventually gets to the DMA api layer and will throw a |
| traceback if the debugging options are set. |
| |
| This allocates the temporary buffer variables with kzalloc instead. |
| |
| Fixes https://bugzilla.redhat.com/show_bug.cgi?id=734506 |
| |
| Signed-off-by: Josh Boyer <jwboyer@redhat.com> |
| Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| drivers/media/dvb/dvb-usb/ttusb2.c | 17 +++++++++++++++-- |
| 1 file changed, 15 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/media/dvb/dvb-usb/ttusb2.c |
| +++ b/drivers/media/dvb/dvb-usb/ttusb2.c |
| @@ -75,10 +75,18 @@ static int ttusb2_msg(struct dvb_usb_dev |
| u8 *wbuf, int wlen, u8 *rbuf, int rlen) |
| { |
| struct ttusb2_state *st = d->priv; |
| - u8 s[wlen+4],r[64] = { 0 }; |
| + u8 *s, *r = NULL; |
| int ret = 0; |
| |
| - memset(s,0,wlen+4); |
| + s = kzalloc(wlen+4, GFP_KERNEL); |
| + if (!s) |
| + return -ENOMEM; |
| + |
| + r = kzalloc(64, GFP_KERNEL); |
| + if (!r) { |
| + kfree(s); |
| + return -ENOMEM; |
| + } |
| |
| s[0] = 0xaa; |
| s[1] = ++st->id; |
| @@ -94,12 +102,17 @@ static int ttusb2_msg(struct dvb_usb_dev |
| r[2] != cmd || |
| (rlen > 0 && r[3] != rlen)) { |
| warn("there might have been an error during control message transfer. (rlen = %d, was %d)",rlen,r[3]); |
| + kfree(s); |
| + kfree(r); |
| return -EIO; |
| } |
| |
| if (rlen > 0) |
| memcpy(rbuf, &r[4], rlen); |
| |
| + kfree(s); |
| + kfree(r); |
| + |
| return 0; |
| } |
| |