Skip to content

Commit a76abed

Browse files
Ziyang Xuangregkh
Ziyang Xuan
authored andcommitted
can: isotp: isotp_sendmsg(): add result check for wait_event_interruptible()
commit 9acf636 upstream. Using wait_event_interruptible() to wait for complete transmission, but do not check the result of wait_event_interruptible() which can be interrupted. It will result in TX buffer has multiple accessors and the later process interferes with the previous process. Following is one of the problems reported by syzbot. ============================================================= WARNING: CPU: 0 PID: 0 at net/can/isotp.c:840 isotp_tx_timer_handler+0x2e0/0x4c0 CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.13.0-rc7+ raspberrypi#68 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1 04/01/2014 RIP: 0010:isotp_tx_timer_handler+0x2e0/0x4c0 Call Trace: <IRQ> ? isotp_setsockopt+0x390/0x390 __hrtimer_run_queues+0xb8/0x610 hrtimer_run_softirq+0x91/0xd0 ? rcu_read_lock_sched_held+0x4d/0x80 __do_softirq+0xe8/0x553 irq_exit_rcu+0xf8/0x100 sysvec_apic_timer_interrupt+0x9e/0xc0 </IRQ> asm_sysvec_apic_timer_interrupt+0x12/0x20 Add result check for wait_event_interruptible() in isotp_sendmsg() to avoid multiple accessers for tx buffer. Fixes: e057dd3 ("can: add ISO 15765-2:2016 transport protocol") Link: https://lore.kernel.org/all/10ca695732c9dd267c76a3c30f37aefe1ff7e32f.1633764159.git.william.xuanziyang@huawei.com Cc: [email protected] Reported-by: [email protected] Signed-off-by: Ziyang Xuan <[email protected]> Acked-by: Oliver Hartkopp <[email protected]> Signed-off-by: Marc Kleine-Budde <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 1d12d11 commit a76abed

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

net/can/isotp.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,9 @@ static int isotp_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
865865
return -EAGAIN;
866866

867867
/* wait for complete transmission of current pdu */
868-
wait_event_interruptible(so->wait, so->tx.state == ISOTP_IDLE);
868+
err = wait_event_interruptible(so->wait, so->tx.state == ISOTP_IDLE);
869+
if (err)
870+
return err;
869871
}
870872

871873
if (!size || size > MAX_MSG_LENGTH)

0 commit comments

Comments
 (0)