Skip to content

Commit 3e8e6f9

Browse files
benquikebwhacks
authored andcommitted
ath6kl: fix a NULL-ptr-deref bug in ath6kl_usb_alloc_urb_from_pipe()
commit 39d170b upstream. The `ar_usb` field of `ath6kl_usb_pipe_usb_pipe` objects are initialized to point to the containing `ath6kl_usb` object according to endpoint descriptors read from the device side, as shown below in `ath6kl_usb_setup_pipe_resources`: for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { endpoint = &iface_desc->endpoint[i].desc; // get the address from endpoint descriptor pipe_num = ath6kl_usb_get_logical_pipe_num(ar_usb, endpoint->bEndpointAddress, &urbcount); ...... // select the pipe object pipe = &ar_usb->pipes[pipe_num]; // initialize the ar_usb field pipe->ar_usb = ar_usb; } The driver assumes that the addresses reported in endpoint descriptors from device side to be complete. If a device is malicious and does not report complete addresses, it may trigger NULL-ptr-deref `ath6kl_usb_alloc_urb_from_pipe` and `ath6kl_usb_free_urb_to_pipe`. This patch fixes the bug by preventing potential NULL-ptr-deref (CVE-2019-15098). Signed-off-by: Hui Peng <[email protected]> Reported-by: Hui Peng <[email protected]> Reported-by: Mathias Payer <[email protected]> Reviewed-by: Greg Kroah-Hartman <[email protected]> Signed-off-by: Kalle Valo <[email protected]> Signed-off-by: Ben Hutchings <[email protected]>
1 parent f45c7f9 commit 3e8e6f9

File tree

1 file changed

+8
-0
lines changed
  • drivers/net/wireless/ath/ath6kl

1 file changed

+8
-0
lines changed

drivers/net/wireless/ath/ath6kl/usb.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ ath6kl_usb_alloc_urb_from_pipe(struct ath6kl_usb_pipe *pipe)
132132
struct ath6kl_urb_context *urb_context = NULL;
133133
unsigned long flags;
134134

135+
/* bail if this pipe is not initialized */
136+
if (!pipe->ar_usb)
137+
return NULL;
138+
135139
spin_lock_irqsave(&pipe->ar_usb->cs_lock, flags);
136140
if (!list_empty(&pipe->urb_list_head)) {
137141
urb_context =
@@ -150,6 +154,10 @@ static void ath6kl_usb_free_urb_to_pipe(struct ath6kl_usb_pipe *pipe,
150154
{
151155
unsigned long flags;
152156

157+
/* bail if this pipe is not initialized */
158+
if (!pipe->ar_usb)
159+
return;
160+
153161
spin_lock_irqsave(&pipe->ar_usb->cs_lock, flags);
154162
pipe->urb_cnt++;
155163

0 commit comments

Comments
 (0)