]>
Commit | Line | Data |
---|---|---|
c1ebd610 GKH |
1 | From foo@baz Tue Feb 14 17:03:08 PST 2017 |
2 | From: Ben Hutchings <ben@decadent.org.uk> | |
3 | Date: Sat, 4 Feb 2017 16:56:32 +0000 | |
4 | Subject: rtl8150: Use heap buffers for all register access | |
5 | ||
6 | From: Ben Hutchings <ben@decadent.org.uk> | |
7 | ||
8 | ||
9 | [ Upstream commit 7926aff5c57b577ab0f43364ff0c59d968f6a414 ] | |
10 | ||
11 | Allocating USB buffers on the stack is not portable, and no longer | |
12 | works on x86_64 (with VMAP_STACK enabled as per default). | |
13 | ||
14 | Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") | |
15 | Signed-off-by: Ben Hutchings <ben@decadent.org.uk> | |
16 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
17 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
18 | --- | |
19 | drivers/net/usb/rtl8150.c | 34 +++++++++++++++++++++++++++------- | |
20 | 1 file changed, 27 insertions(+), 7 deletions(-) | |
21 | ||
22 | --- a/drivers/net/usb/rtl8150.c | |
23 | +++ b/drivers/net/usb/rtl8150.c | |
24 | @@ -155,16 +155,36 @@ static const char driver_name [] = "rtl8 | |
25 | */ | |
26 | static int get_registers(rtl8150_t * dev, u16 indx, u16 size, void *data) | |
27 | { | |
28 | - return usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), | |
29 | - RTL8150_REQ_GET_REGS, RTL8150_REQT_READ, | |
30 | - indx, 0, data, size, 500); | |
31 | + void *buf; | |
32 | + int ret; | |
33 | + | |
34 | + buf = kmalloc(size, GFP_NOIO); | |
35 | + if (!buf) | |
36 | + return -ENOMEM; | |
37 | + | |
38 | + ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0), | |
39 | + RTL8150_REQ_GET_REGS, RTL8150_REQT_READ, | |
40 | + indx, 0, buf, size, 500); | |
41 | + if (ret > 0 && ret <= size) | |
42 | + memcpy(data, buf, ret); | |
43 | + kfree(buf); | |
44 | + return ret; | |
45 | } | |
46 | ||
47 | -static int set_registers(rtl8150_t * dev, u16 indx, u16 size, void *data) | |
48 | +static int set_registers(rtl8150_t * dev, u16 indx, u16 size, const void *data) | |
49 | { | |
50 | - return usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | |
51 | - RTL8150_REQ_SET_REGS, RTL8150_REQT_WRITE, | |
52 | - indx, 0, data, size, 500); | |
53 | + void *buf; | |
54 | + int ret; | |
55 | + | |
56 | + buf = kmemdup(data, size, GFP_NOIO); | |
57 | + if (!buf) | |
58 | + return -ENOMEM; | |
59 | + | |
60 | + ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0), | |
61 | + RTL8150_REQ_SET_REGS, RTL8150_REQT_WRITE, | |
62 | + indx, 0, buf, size, 500); | |
63 | + kfree(buf); | |
64 | + return ret; | |
65 | } | |
66 | ||
67 | static void async_set_reg_cb(struct urb *urb) |