[PATCH v9 4/4] can: isotp: fix state machine corruption on signal interruption
Oliver Hartkopp via B4 Relay <[email protected]>
| Newsgroups | org.kernel.vger.linux-can,org.kernel.feeds.b4-sent |
|---|---|
| Message-ID | <[email protected]> |
From: Oliver Hartkopp <[email protected]> If a thread blocked in isotp_sendmsg() waiting for a previous transfer to finish is interrupted by a signal, jumping to the cleanup labels incorrectly cancels active timers and forces 'so->tx.state' back to ISOTP_IDLE. Since this thread never owned the active transmission, it abruptly aborts another thread's legitimate transfer, so return the interruption error directly. Fixes: e057dd3fc20f ("can: add ISO 15765-2:2016 transport protocol") Signed-off-by: Oliver Hartkopp <[email protected]> --- net/can/isotp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/can/isotp.c b/net/can/isotp.c index c4ca8a64e7ce..56618ea1dae4 100644 --- a/net/can/isotp.c +++ b/net/can/isotp.c @@ -1045,11 +1045,11 @@ static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size) return -EADDRNOTAVAIL; /* wait for complete transmission of current pdu */ err = wait_event_interruptible(so->wait, so->tx.state == ISOTP_IDLE); if (err) - goto err_event_drop; + return err; } /* new transfer: bump the generation (gen is used below and by * isotp_tx_timeout()/isotp_rcv_echo()) and drain the old one - * cancel its timers ourselves in case one is still concurrently -- 2.53.0