Skip to content

Commit 7926aff

Browse files
bwhacksdavem330
authored andcommitted
rtl8150: Use heap buffers for all register access
Allocating USB buffers on the stack is not portable, and no longer works on x86_64 (with VMAP_STACK enabled as per default). Fixes: 1da177e ("Linux-2.6.12-rc2") Signed-off-by: Ben Hutchings <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5593523 commit 7926aff

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

drivers/net/usb/rtl8150.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -155,16 +155,36 @@ static const char driver_name [] = "rtl8150";
155155
*/
156156
static int get_registers(rtl8150_t * dev, u16 indx, u16 size, void *data)
157157
{
158-
return usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
159-
RTL8150_REQ_GET_REGS, RTL8150_REQT_READ,
160-
indx, 0, data, size, 500);
158+
void *buf;
159+
int ret;
160+
161+
buf = kmalloc(size, GFP_NOIO);
162+
if (!buf)
163+
return -ENOMEM;
164+
165+
ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev, 0),
166+
RTL8150_REQ_GET_REGS, RTL8150_REQT_READ,
167+
indx, 0, buf, size, 500);
168+
if (ret > 0 && ret <= size)
169+
memcpy(data, buf, ret);
170+
kfree(buf);
171+
return ret;
161172
}
162173

163-
static int set_registers(rtl8150_t * dev, u16 indx, u16 size, void *data)
174+
static int set_registers(rtl8150_t * dev, u16 indx, u16 size, const void *data)
164175
{
165-
return usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
166-
RTL8150_REQ_SET_REGS, RTL8150_REQT_WRITE,
167-
indx, 0, data, size, 500);
176+
void *buf;
177+
int ret;
178+
179+
buf = kmemdup(data, size, GFP_NOIO);
180+
if (!buf)
181+
return -ENOMEM;
182+
183+
ret = usb_control_msg(dev->udev, usb_sndctrlpipe(dev->udev, 0),
184+
RTL8150_REQ_SET_REGS, RTL8150_REQT_WRITE,
185+
indx, 0, buf, size, 500);
186+
kfree(buf);
187+
return ret;
168188
}
169189

170190
static void async_set_reg_cb(struct urb *urb)

0 commit comments

Comments
 (0)