<feed xmlns='http://www.w3.org/2005/Atom'>
<title>kernel/linux.git/drivers/net/usb/usbnet.c, branch v4.9.331</title>
<subtitle>Linux kernel stable tree (mirror)</subtitle>
<id>https://git.radix-linux.su/kernel/linux.git/atom?h=v4.9.331</id>
<link rel='self' href='https://git.radix-linux.su/kernel/linux.git/atom?h=v4.9.331'/>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/'/>
<updated>2022-10-26T11:15:33+00:00</updated>
<entry>
<title>usbnet: Fix memory leak in usbnet_disconnect()</title>
<updated>2022-10-26T11:15:33+00:00</updated>
<author>
<name>Peilin Ye</name>
<email>peilin.ye@bytedance.com</email>
</author>
<published>2022-09-23T04:25:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=08e3d353b7c284126247a5329d4437778738d730'/>
<id>urn:sha1:08e3d353b7c284126247a5329d4437778738d730</id>
<content type='text'>
[ Upstream commit a43206156263fbaf1f2b7f96257441f331e91bb7 ]

Currently usbnet_disconnect() unanchors and frees all deferred URBs
using usb_scuttle_anchored_urbs(), which does not free urb-&gt;context,
causing a memory leak as reported by syzbot.

Use a usb_get_from_anchor() while loop instead, similar to what we did
in commit 19cfe912c37b ("Bluetooth: btusb: Fix memory leak in
play_deferred").  Also free urb-&gt;sg.

Reported-and-tested-by: syzbot+dcd3e13cf4472f2e0ba1@syzkaller.appspotmail.com
Fixes: 69ee472f2706 ("usbnet &amp; cdc-ether: Autosuspend for online devices")
Fixes: 638c5115a794 ("USBNET: support DMA SG")
Signed-off-by: Peilin Ye &lt;peilin.ye@bytedance.com&gt;
Link: https://lore.kernel.org/r/20220923042551.2745-1-yepeilin.cs@gmail.com
Signed-off-by: Jakub Kicinski &lt;kuba@kernel.org&gt;
Signed-off-by: Sasha Levin &lt;sashal@kernel.org&gt;
</content>
</entry>
<entry>
<title>usbnet: Fix linkwatch use-after-free on disconnect</title>
<updated>2022-08-25T09:09:24+00:00</updated>
<author>
<name>Lukas Wunner</name>
<email>lukas@wunner.de</email>
</author>
<published>2022-06-23T12:50:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=d2d6b530d89b0a912148018027386aa049f0a309'/>
<id>urn:sha1:d2d6b530d89b0a912148018027386aa049f0a309</id>
<content type='text'>
commit a69e617e533edddf3fa3123149900f36e0a6dc74 upstream.

usbnet uses the work usbnet_deferred_kevent() to perform tasks which may
sleep.  On disconnect, completion of the work was originally awaited in
-&gt;ndo_stop().  But in 2003, that was moved to -&gt;disconnect() by historic
commit "[PATCH] USB: usbnet, prevent exotic rtnl deadlock":

  https://git.kernel.org/tglx/history/c/0f138bbfd83c

The change was made because back then, the kernel's workqueue
implementation did not allow waiting for a single work.  One had to wait
for completion of *all* work by calling flush_scheduled_work(), and that
could deadlock when waiting for usbnet_deferred_kevent() with rtnl_mutex
held in -&gt;ndo_stop().

The commit solved one problem but created another:  It causes a
use-after-free in USB Ethernet drivers aqc111.c, asix_devices.c,
ax88179_178a.c, ch9200.c and smsc75xx.c:

* If the drivers receive a link change interrupt immediately before
  disconnect, they raise EVENT_LINK_RESET in their (non-sleepable)
  -&gt;status() callback and schedule usbnet_deferred_kevent().
* usbnet_deferred_kevent() invokes the driver's -&gt;link_reset() callback,
  which calls netif_carrier_{on,off}().
* That in turn schedules the work linkwatch_event().

Because usbnet_deferred_kevent() is awaited after unregister_netdev(),
netif_carrier_{on,off}() may operate on an unregistered netdev and
linkwatch_event() may run after free_netdev(), causing a use-after-free.

In 2010, usbnet was changed to only wait for a single instance of
usbnet_deferred_kevent() instead of *all* work by commit 23f333a2bfaf
("drivers/net: don't use flush_scheduled_work()").

Unfortunately the commit neglected to move the wait back to
-&gt;ndo_stop().  Rectify that omission at long last.

Reported-by: Jann Horn &lt;jannh@google.com&gt;
Link: https://lore.kernel.org/netdev/CAG48ez0MHBbENX5gCdHAUXZ7h7s20LnepBF-pa5M=7Bi-jZrEA@mail.gmail.com/
Reported-by: Oleksij Rempel &lt;o.rempel@pengutronix.de&gt;
Link: https://lore.kernel.org/netdev/20220315113841.GA22337@pengutronix.de/
Signed-off-by: Lukas Wunner &lt;lukas@wunner.de&gt;
Cc: stable@vger.kernel.org
Acked-by: Oliver Neukum &lt;oneukum@suse.com&gt;
Link: https://lore.kernel.org/r/d1c87ebe9fc502bffcd1576e238d685ad08321e4.1655987888.git.lukas@wunner.de
Signed-off-by: Jakub Kicinski &lt;kuba@kernel.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: fix memory leak in error case</title>
<updated>2022-07-12T14:26:24+00:00</updated>
<author>
<name>Oliver Neukum</name>
<email>oneukum@suse.com</email>
</author>
<published>2022-07-05T12:53:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=3eed421ca5c809da93456f69203d164d5220be3d'/>
<id>urn:sha1:3eed421ca5c809da93456f69203d164d5220be3d</id>
<content type='text'>
commit b55a21b764c1e182014630fa5486d717484ac58f upstream.

usbnet_write_cmd_async() mixed up which buffers
need to be freed in which error case.

v2: add Fixes tag
v3: fix uninitialized buf pointer

Fixes: 877bd862f32b8 ("usbnet: introduce usbnet 3 command helpers")
Signed-off-by: Oliver Neukum &lt;oneukum@suse.com&gt;
Link: https://lore.kernel.org/r/20220705125351.17309-1-oneukum@suse.com
Signed-off-by: Jakub Kicinski &lt;kuba@kernel.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: fix memory allocation in helpers</title>
<updated>2022-07-07T15:30:10+00:00</updated>
<author>
<name>Oliver Neukum</name>
<email>oneukum@suse.com</email>
</author>
<published>2022-06-28T09:35:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=671191cee354d12926e086ab41567ee63fc3873a'/>
<id>urn:sha1:671191cee354d12926e086ab41567ee63fc3873a</id>
<content type='text'>
commit e65af5403e462ccd7dff6a045a886c64da598c2e upstream.

usbnet provides some helper functions that are also used in
the context of reset() operations. During a reset the other
drivers on a device are unable to operate. As that can be block
drivers, a driver for another interface cannot use paging
in its memory allocations without risking a deadlock.
Use GFP_NOIO in the helpers.

Fixes: 877bd862f32b8 ("usbnet: introduce usbnet 3 command helpers")
Signed-off-by: Oliver Neukum &lt;oneukum@suse.com&gt;
Link: https://lore.kernel.org/r/20220628093517.7469-1-oneukum@suse.com
Signed-off-by: Jakub Kicinski &lt;kuba@kernel.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: make sure no NULL pointer is passed through</title>
<updated>2022-07-07T15:30:10+00:00</updated>
<author>
<name>Oliver Neukum</name>
<email>oneukum@suse.com</email>
</author>
<published>2017-04-05T12:14:39+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=5e69b6a25befa32d2dcfa280851c7e4d1922b1a1'/>
<id>urn:sha1:5e69b6a25befa32d2dcfa280851c7e4d1922b1a1</id>
<content type='text'>
commit 6c22fce07c97f765af1808ec3be007847e0b47d1 upstream.

Coverity reports:

	** CID 751368:  Null pointer dereferences  (FORWARD_NULL)
	/drivers/net/usb/usbnet.c: 1925 in __usbnet_read_cmd()

	________________________________________________________________________________________________________
	*** CID 751368:  Null pointer dereferences  (FORWARD_NULL)
	/drivers/net/usb/usbnet.c: 1925 in __usbnet_read_cmd()
	1919     EXPORT_SYMBOL(usbnet_link_change);
	1920
	1921     /*-------------------------------------------------------------------------*/
	1922     static int __usbnet_read_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
	1923                                 u16 value, u16 index, void *data, u16 size)
	1924     {
	&gt;&gt;&gt;     CID 751368:  Null pointer dereferences  (FORWARD_NULL)
	&gt;&gt;&gt;     Assigning: "buf" = "NULL".
	1925            void *buf = NULL;
	1926            int err = -ENOMEM;
	1927
	1928            netdev_dbg(dev-&gt;net, "usbnet_read_cmd cmd=0x%02x reqtype=%02x"
	1929                       " value=0x%04x index=0x%04x size=%d\n",
	1930                       cmd, reqtype, value, index, size);

	** CID 751370:  Null pointer dereferences  (FORWARD_NULL)
	/drivers/net/usb/usbnet.c: 1952 in __usbnet_write_cmd()

	________________________________________________________________________________________________________
	*** CID 751370:  Null pointer dereferences  (FORWARD_NULL)
	/drivers/net/usb/usbnet.c: 1952 in __usbnet_write_cmd()
	1946     }
	1947
	1948     static int __usbnet_write_cmd(struct usbnet *dev, u8 cmd, u8 reqtype,
	1949                                  u16 value, u16 index, const void *data,
	1950                                  u16 size)
	1951     {
	&gt;&gt;&gt;     CID 751370:  Null pointer dereferences  (FORWARD_NULL)
	&gt;&gt;&gt;     Assigning: "buf" = "NULL".
	1952            void *buf = NULL;
	1953            int err = -ENOMEM;
	1954
	1955            netdev_dbg(dev-&gt;net, "usbnet_write_cmd cmd=0x%02x reqtype=%02x"
	1956                       " value=0x%04x index=0x%04x size=%d\n",
	1957                       cmd, reqtype, value, index, size);

	** CID 1325026:  Null pointer dereferences  (FORWARD_NULL)
	/drivers/net/usb/ch9200.c: 143 in control_write()

It is valid to offer commands without a buffer, but then you need a size
of zero. This should actually be checked.

Signed-off-by: Oliver Neukum &lt;oneukum@suse.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: fix error return code in usbnet_probe()</title>
<updated>2021-11-02T16:39:22+00:00</updated>
<author>
<name>Wang Hai</name>
<email>wanghai38@huawei.com</email>
</author>
<published>2021-10-26T12:40:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=5a3a5e1efd63751781a75d1e289b5319729a3b6c'/>
<id>urn:sha1:5a3a5e1efd63751781a75d1e289b5319729a3b6c</id>
<content type='text'>
commit 6f7c88691191e6c52ef2543d6f1da8d360b27a24 upstream.

Return error code if usb_maxpacket() returns 0 in usbnet_probe()

Fixes: 397430b50a36 ("usbnet: sanity check for maxpacket")
Reported-by: Hulk Robot &lt;hulkci@huawei.com&gt;
Signed-off-by: Wang Hai &lt;wanghai38@huawei.com&gt;
Reviewed-by: Johan Hovold &lt;johan@kernel.org&gt;
Link: https://lore.kernel.org/r/20211026124015.3025136-1-wanghai38@huawei.com
Signed-off-by: Jakub Kicinski &lt;kuba@kernel.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: sanity check for maxpacket</title>
<updated>2021-11-02T16:39:22+00:00</updated>
<author>
<name>Oliver Neukum</name>
<email>oneukum@suse.com</email>
</author>
<published>2021-10-21T12:29:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=524f333e98138d909a0a0c574a9ff6737dce2767'/>
<id>urn:sha1:524f333e98138d909a0a0c574a9ff6737dce2767</id>
<content type='text'>
commit 397430b50a363d8b7bdda00522123f82df6adc5e upstream.

maxpacket of 0 makes no sense and oopses as we need to divide
by it. Give up.

V2: fixed typo in log and stylistic issues

Signed-off-by: Oliver Neukum &lt;oneukum@suse.com&gt;
Reported-by: syzbot+76bb1d34ffa0adc03baa@syzkaller.appspotmail.com
Reviewed-by: Johan Hovold &lt;johan@kernel.org&gt;
Link: https://lore.kernel.org/r/20211021122944.21816-1-oneukum@suse.com
Signed-off-by: Jakub Kicinski &lt;kuba@kernel.org&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: sanity checking of packet sizes and device mtu</title>
<updated>2019-10-05T10:30:14+00:00</updated>
<author>
<name>Oliver Neukum</name>
<email>oneukum@suse.com</email>
</author>
<published>2019-09-19T08:23:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=55416208602b20a5079a75dbef901feb8f1e9c69'/>
<id>urn:sha1:55416208602b20a5079a75dbef901feb8f1e9c69</id>
<content type='text'>
[ Upstream commit 280ceaed79f18db930c0cc8bb21f6493490bf29c ]

After a reset packet sizes and device mtu can change and need
to be reevaluated to calculate queue sizes.
Malicious devices can set this to zero and we divide by it.
Introduce sanity checking.

Reported-and-tested-by:  syzbot+6102c120be558c885f04@syzkaller.appspotmail.com
Signed-off-by: Oliver Neukum &lt;oneukum@suse.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: ignore endpoints with invalid wMaxPacketSize</title>
<updated>2019-10-05T10:30:14+00:00</updated>
<author>
<name>Bjørn Mork</name>
<email>bjorn@mork.no</email>
</author>
<published>2019-09-18T12:17:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=96f23cb83539bb569a02b5524a62c18c7b8c40e2'/>
<id>urn:sha1:96f23cb83539bb569a02b5524a62c18c7b8c40e2</id>
<content type='text'>
[ Upstream commit 8d3d7c2029c1b360f1a6b0a2fca470b57eb575c0 ]

Endpoints with zero wMaxPacketSize are not usable for transferring
data. Ignore such endpoints when looking for valid in, out and
status pipes, to make the drivers more robust against invalid and
meaningless descriptors.

The wMaxPacketSize of these endpoints are used for memory allocations
and as divisors in many usbnet minidrivers. Avoiding zero is therefore
critical.

Signed-off-by: Bjørn Mork &lt;bjorn@mork.no&gt;
Signed-off-by: Jakub Kicinski &lt;jakub.kicinski@netronome.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
<entry>
<title>usbnet: fix kernel crash after disconnect</title>
<updated>2019-06-11T10:22:34+00:00</updated>
<author>
<name>Kloetzke Jan</name>
<email>Jan.Kloetzke@preh.de</email>
</author>
<published>2019-05-21T13:18:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.radix-linux.su/kernel/linux.git/commit/?id=ed7b03fe98adeefd56c3d699da57b1f79ada4a22'/>
<id>urn:sha1:ed7b03fe98adeefd56c3d699da57b1f79ada4a22</id>
<content type='text'>
[ Upstream commit ad70411a978d1e6e97b1e341a7bde9a79af0c93d ]

When disconnecting cdc_ncm the kernel sporadically crashes shortly
after the disconnect:

  [   57.868812] Unable to handle kernel NULL pointer dereference at virtual address 00000000
  ...
  [   58.006653] PC is at 0x0
  [   58.009202] LR is at call_timer_fn+0xec/0x1b4
  [   58.013567] pc : [&lt;0000000000000000&gt;] lr : [&lt;ffffff80080f5130&gt;] pstate: 00000145
  [   58.020976] sp : ffffff8008003da0
  [   58.024295] x29: ffffff8008003da0 x28: 0000000000000001
  [   58.029618] x27: 000000000000000a x26: 0000000000000100
  [   58.034941] x25: 0000000000000000 x24: ffffff8008003e68
  [   58.040263] x23: 0000000000000000 x22: 0000000000000000
  [   58.045587] x21: 0000000000000000 x20: ffffffc68fac1808
  [   58.050910] x19: 0000000000000100 x18: 0000000000000000
  [   58.056232] x17: 0000007f885aff8c x16: 0000007f883a9f10
  [   58.061556] x15: 0000000000000001 x14: 000000000000006e
  [   58.066878] x13: 0000000000000000 x12: 00000000000000ba
  [   58.072201] x11: ffffffc69ff1db30 x10: 0000000000000020
  [   58.077524] x9 : 8000100008001000 x8 : 0000000000000001
  [   58.082847] x7 : 0000000000000800 x6 : ffffff8008003e70
  [   58.088169] x5 : ffffffc69ff17a28 x4 : 00000000ffff138b
  [   58.093492] x3 : 0000000000000000 x2 : 0000000000000000
  [   58.098814] x1 : 0000000000000000 x0 : 0000000000000000
  ...
  [   58.205800] [&lt;          (null)&gt;]           (null)
  [   58.210521] [&lt;ffffff80080f5298&gt;] expire_timers+0xa0/0x14c
  [   58.215937] [&lt;ffffff80080f542c&gt;] run_timer_softirq+0xe8/0x128
  [   58.221702] [&lt;ffffff8008081120&gt;] __do_softirq+0x298/0x348
  [   58.227118] [&lt;ffffff80080a6304&gt;] irq_exit+0x74/0xbc
  [   58.232009] [&lt;ffffff80080e17dc&gt;] __handle_domain_irq+0x78/0xac
  [   58.237857] [&lt;ffffff8008080cf4&gt;] gic_handle_irq+0x80/0xac
  ...

The crash happens roughly 125..130ms after the disconnect. This
correlates with the 'delay' timer that is started on certain USB tx/rx
errors in the URB completion handler.

The problem is a race of usbnet_stop() with usbnet_start_xmit(). In
usbnet_stop() we call usbnet_terminate_urbs() to cancel all URBs in
flight. This only makes sense if no new URBs are submitted
concurrently, though. But the usbnet_start_xmit() can run at the same
time on another CPU which almost unconditionally submits an URB. The
error callback of the new URB will then schedule the timer after it was
already stopped.

The fix adds a check if the tx queue is stopped after the tx list lock
has been taken. This should reliably prevent the submission of new URBs
while usbnet_terminate_urbs() does its job. The same thing is done on
the rx side even though it might be safe due to other flags that are
checked there.

Signed-off-by: Jan Klötzke &lt;Jan.Kloetzke@preh.de&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;
</content>
</entry>
</feed>
