From: Vincent Mailhol <hidden> Date: 2021-01-20 12:21:09
This series fix three bugs which all have the same root cause.
When calling netif_rx(skb) and its variants, the skb will eventually
get consumed (or freed) and thus it is unsafe to dereference it after
the call returns.
This remark especially applies to any variable with aliases the skb
memory which is the case of the can(fd)_frame.
The pattern is as this:
skb = alloc_can_skb(dev, &cf);
/* Do stuff */
netif_rx(skb);
stats->rx_bytes += cf->len;
Increasing the stats should be done *before* the call to netif_rx()
while the skb is still safe to use.
Changes since v3:
- Patch 1/3: move the comments for upstream after the --- scissors
Changes since v2:
- rebase on net/master
- Patch 1/3: Added a comment towards upstream to inform about a
conflict which will occur when net-next and net are merged
Ref: https://lore.kernel.org/linux-can/20210120085356.m7nabbw5zhy7prpo@hardanger.blackshift.org/
Changes since v1:
- fix a silly typo in patch 2/3 (variable len was declared twice...)
Vincent Mailhol (3):
can: dev: can_restart: fix use after free bug
can: vxcan: vxcan_xmit: fix use after free bug
can: peak_usb: fix use after free bugs
drivers/net/can/dev.c | 4 ++--
drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 8 ++++----
drivers/net/can/vxcan.c | 6 ++++--
3 files changed, 10 insertions(+), 8 deletions(-)
base-commit: 9c30ae8398b0813e237bde387d67a7f74ab2db2d
--
2.26.2
From: Vincent Mailhol <hidden> Date: 2021-01-20 12:21:09
After calling netif_rx_ni(skb), dereferencing skb is unsafe.
Especially, the can_frame cf which aliases skb memory is accessed
after the netif_rx_ni() in:
stats->rx_bytes += cf->len;
Reordering the lines solves the issue.
Fixes: 39549eef3587 ("can: CAN Network device driver and Netlink interface")
Signed-off-by: Vincent Mailhol <redacted>
---
*Remark for upstream*
drivers/net/can/dev.c has been moved to drivers/net/can/dev/dev.c in
below commit, please carry the patch forward.
Reference: 3e77f70e7345 ("can: dev: move driver related infrastructure
into separate subdir")
---
drivers/net/can/dev.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
From: Vincent Mailhol <hidden> Date: 2021-01-20 12:21:09
After calling peak_usb_netif_rx_ni(skb), dereferencing skb is unsafe.
Especially, the can_frame cf which aliases skb memory is accessed
after the peak_usb_netif_rx_ni().
Reordering the lines solves the issue.
Fixes: 0a25e1f4f185 ("can: peak_usb: add support for PEAK new CANFD USB adapters")
Signed-off-by: Vincent Mailhol <redacted>
---
drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
From: Vincent Mailhol <hidden> Date: 2021-01-20 12:35:23
After calling netif_rx_ni(skb), dereferencing skb is unsafe.
Especially, the canfd_frame cfd which aliases skb memory is accessed
after the netif_rx_ni().
Fixes: a8f820a380a2 ("can: add Virtual CAN Tunnel driver (vxcan)")
Signed-off-by: Vincent Mailhol <redacted>
---
drivers/net/can/vxcan.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
From: Marc Kleine-Budde <mkl@pengutronix.de> Date: 2021-01-20 13:55:43
On 1/20/21 12:41 PM, Vincent Mailhol wrote:
This series fix three bugs which all have the same root cause.
When calling netif_rx(skb) and its variants, the skb will eventually
get consumed (or freed) and thus it is unsafe to dereference it after
the call returns.
This remark especially applies to any variable with aliases the skb
memory which is the case of the can(fd)_frame.
The pattern is as this:
skb = alloc_can_skb(dev, &cf);
/* Do stuff */
netif_rx(skb);
stats->rx_bytes += cf->len;
Increasing the stats should be done *before* the call to netif_rx()
while the skb is still safe to use.
Changes since v3:
- Patch 1/3: move the comments for upstream after the --- scissors
Changes since v2:
- rebase on net/master
- Patch 1/3: Added a comment towards upstream to inform about a
conflict which will occur when net-next and net are merged
Ref: https://lore.kernel.org/linux-can/20210120085356.m7nabbw5zhy7prpo@hardanger.blackshift.org/
Changes since v1:
- fix a silly typo in patch 2/3 (variable len was declared twice...)
Vincent Mailhol (3):
can: dev: can_restart: fix use after free bug
can: vxcan: vxcan_xmit: fix use after free bug
can: peak_usb: fix use after free bugs
drivers/net/can/dev.c | 4 ++--
drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 8 ++++----
drivers/net/can/vxcan.c | 6 ++++--
3 files changed, 10 insertions(+), 8 deletions(-)
Applied to linux-can-testing. I don't know why 2/3 hasn't made it to the mail
archive yet.
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
From: Marc Kleine-Budde <mkl@pengutronix.de> Date: 2021-01-20 13:58:55
On 1/20/21 12:41 PM, Vincent Mailhol wrote:
After calling netif_rx_ni(skb), dereferencing skb is unsafe.
Especially, the can_frame cf which aliases skb memory is accessed
after the netif_rx_ni() in:
stats->rx_bytes += cf->len;
Reordering the lines solves the issue.
Fixes: 39549eef3587 ("can: CAN Network device driver and Netlink interface")
Signed-off-by: Vincent Mailhol <redacted>
---
*Remark for upstream*
drivers/net/can/dev.c has been moved to drivers/net/can/dev/dev.c in
below commit, please carry the patch forward.
Reference: 3e77f70e7345 ("can: dev: move driver related infrastructure
into separate subdir")
I've send a pull request to Jakub and David. Let's see what happens :)
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
From: Vincent MAILHOL <hidden> Date: 2021-01-20 13:58:55
On Wed. 20 janv. 2021 at 21:53, Marc Kleine-Budde [off-list ref] wrote:
On 1/20/21 12:41 PM, Vincent Mailhol wrote:
quoted
After calling netif_rx_ni(skb), dereferencing skb is unsafe.
Especially, the can_frame cf which aliases skb memory is accessed
after the netif_rx_ni() in:
stats->rx_bytes += cf->len;
Reordering the lines solves the issue.
Fixes: 39549eef3587 ("can: CAN Network device driver and Netlink interface")
Signed-off-by: Vincent Mailhol <redacted>
---
*Remark for upstream*
drivers/net/can/dev.c has been moved to drivers/net/can/dev/dev.c in
below commit, please carry the patch forward.
Reference: 3e77f70e7345 ("can: dev: move driver related infrastructure
into separate subdir")
I've send a pull request to Jakub and David. Let's see what happens :)
Thanks!
Yours sincerely,
Vincent
Marc
--
Pengutronix e.K. | Marc Kleine-Budde |
Embedded Linux | https://www.pengutronix.de |
Vertretung West/Dortmund | Phone: +49-231-2826-924 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
Hello:
This series was applied to netdev/net.git (refs/heads/master):
On Wed, 20 Jan 2021 20:41:34 +0900 you wrote:
This series fix three bugs which all have the same root cause.
When calling netif_rx(skb) and its variants, the skb will eventually
get consumed (or freed) and thus it is unsafe to dereference it after
the call returns.
This remark especially applies to any variable with aliases the skb
memory which is the case of the can(fd)_frame.
[...]