diff mbox series

[v2,2/2] net: eth-uclass: Fix data abort when tftp get nonexistent file via usb

Message ID 20220328095745.19516-2-qianfanguijin@163.com
State Superseded
Delegated to: Ramon Fried
Headers show
Series [v2,1/2] net: eth-uclass: Fix eth_halt | expand

Commit Message

qianfan March 28, 2022, 9:57 a.m. UTC
From: qianfan Zhao <qianfanguijin@163.com>

tftp_handler do eth_halt when TFTP_ERROR, but eth_halt will remove eth
device if it is an usb network. usbeth's private data will be unaccessable
when usb_eth_free_pkt, touch it will trigger data abort.

Next is the console messages:

=> tftp xxx
...
Loading: *
TFTP error: 'open failed: No such file or directory' (1)
Not retrying...
data abort
pc : [<9feb6ba2>]          lr : [<9feb6b9f>]

Fix it.

Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
---
 net/eth-uclass.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Ramon Fried April 1, 2022, 7:23 p.m. UTC | #1
On Mon, Mar 28, 2022 at 12:58 PM <qianfanguijin@163.com> wrote:
>
> From: qianfan Zhao <qianfanguijin@163.com>
>
> tftp_handler do eth_halt when TFTP_ERROR, but eth_halt will remove eth
> device if it is an usb network. usbeth's private data will be unaccessable
> when usb_eth_free_pkt, touch it will trigger data abort.
>
> Next is the console messages:
>
> => tftp xxx
> ...
> Loading: *
> TFTP error: 'open failed: No such file or directory' (1)
> Not retrying...
> data abort
> pc : [<9feb6ba2>]          lr : [<9feb6b9f>]
>
> Fix it.
>
> Signed-off-by: qianfan Zhao <qianfanguijin@163.com>
> ---
>  net/eth-uclass.c | 7 +++++++
>  1 file changed, 7 insertions(+)
>
> diff --git a/net/eth-uclass.c b/net/eth-uclass.c
> index c6eb1bc8f8..27baf52c26 100644
> --- a/net/eth-uclass.c
> +++ b/net/eth-uclass.c
> @@ -405,6 +405,13 @@ int eth_rx(void)
>                 flags = 0;
>                 if (ret > 0)
>                         net_process_received_packet(packet, ret);
> +
> +               /* ethernet maybe halted when packet_handler, check again */
> +               if (!eth_is_active(current)) {
> +                       ret = 0;
> +                       break;
> +               }
> +
>                 if (ret >= 0 && eth_get_ops(current)->free_pkt)
>                         eth_get_ops(current)->free_pkt(current, packet, ret);
>                 if (ret <= 0)
> --
> 2.17.1
>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
diff mbox series

Patch

diff --git a/net/eth-uclass.c b/net/eth-uclass.c
index c6eb1bc8f8..27baf52c26 100644
--- a/net/eth-uclass.c
+++ b/net/eth-uclass.c
@@ -405,6 +405,13 @@  int eth_rx(void)
 		flags = 0;
 		if (ret > 0)
 			net_process_received_packet(packet, ret);
+
+		/* ethernet maybe halted when packet_handler, check again */
+		if (!eth_is_active(current)) {
+			ret = 0;
+			break;
+		}
+
 		if (ret >= 0 && eth_get_ops(current)->free_pkt)
 			eth_get_ops(current)->free_pkt(current, packet, ret);
 		if (ret <= 0)