Module Name:    src
Committed By:   riastradh
Date:           Sat Mar 12 15:30:42 UTC 2022

Modified Files:
        src/sys/dev/usb: vhci.c

Log Message:
vhci(4): Don't fail with ENOBUFS if no intrxfer is set up.

uhub(4) will set up the intrxfer and query the current state at its
leisure -- no need to treat racing with it as a failure.

(If there's some reason the caller needs to know about this state,
then (a) there should be a comment explaining why, and (b) the
assertion in vhci_fd_close needs to change.)

Should fix a host of syzbot crashes that were all tripping over the
same assertion but with different gobbledegook on the console --
here's all the ones I found in a quick skim of the front page:

Reported-by: syzbot+58b183ac688d656e1...@syzkaller.appspotmail.com
Reported-by: syzbot+e7b0e904184aa2c18...@syzkaller.appspotmail.com
Reported-by: syzbot+476b25a0a3655f356...@syzkaller.appspotmail.com
Reported-by: syzbot+e5b69892daf87a746...@syzkaller.appspotmail.com
Reported-by: syzbot+db7f0bc71c33a488d...@syzkaller.appspotmail.com
Reported-by: syzbot+71d0e82df292c5673...@syzkaller.appspotmail.com
Reported-by: syzbot+dbfaad061b2c909d6...@syzkaller.appspotmail.com
Reported-by: syzbot+d8b90cead59b887fe...@syzkaller.appspotmail.com
Reported-by: syzbot+ea147adc4461acb9f...@syzkaller.appspotmail.com
Reported-by: syzbot+cb7239776d4f51c39...@syzkaller.appspotmail.com
Reported-by: syzbot+ffbae2dd4d4a0196b...@syzkaller.appspotmail.com
Reported-by: syzbot+95d4852ea931f775c...@syzkaller.appspotmail.com
Reported-by: syzbot+3236a5e1bc356909b...@syzkaller.appspotmail.com
Reported-by: syzbot+f5ac32d58eab38bce...@syzkaller.appspotmail.com
Reported-by: syzbot+beb9643da72188117...@syzkaller.appspotmail.com
Reported-by: syzbot+896191203695ba350...@syzkaller.appspotmail.com
Reported-by: syzbot+7c175b48b2682cc32...@syzkaller.appspotmail.com
Reported-by: syzbot+caa5bc391d36d7533...@syzkaller.appspotmail.com
Reported-by: syzbot+9fe6d4c43fa10f9e4...@syzkaller.appspotmail.com
Reported-by: syzbot+ae9ae663386e72d17...@syzkaller.appspotmail.com
Reported-by: syzbot+a0c3a5c2f7af91e44...@syzkaller.appspotmail.com
Reported-by: syzbot+3c157b017d0cafa7a...@syzkaller.appspotmail.com
Reported-by: syzbot+1e05efbbf2d7df821...@syzkaller.appspotmail.com
Reported-by: syzbot+999f20b408f61e22f...@syzkaller.appspotmail.com
Reported-by: syzbot+22d227370f78b3a34...@syzkaller.appspotmail.com
Reported-by: syzbot+33760fa9b95349460...@syzkaller.appspotmail.com
Reported-by: syzbot+75d865aafbc9ebadb...@syzkaller.appspotmail.com
Reported-by: syzbot+3ddff5cb80bc0c9ac...@syzkaller.appspotmail.com
Reported-by: syzbot+0f942570160d533d8...@syzkaller.appspotmail.com


To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/usb/vhci.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/vhci.c
diff -u src/sys/dev/usb/vhci.c:1.25 src/sys/dev/usb/vhci.c:1.26
--- src/sys/dev/usb/vhci.c:1.25	Thu Mar  3 06:12:11 2022
+++ src/sys/dev/usb/vhci.c	Sat Mar 12 15:30:42 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: vhci.c,v 1.25 2022/03/03 06:12:11 riastradh Exp $ */
+/*	$NetBSD: vhci.c,v 1.26 2022/03/12 15:30:42 riastradh Exp $ */
 
 /*
  * Copyright (c) 2019-2020 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vhci.c,v 1.25 2022/03/03 06:12:11 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vhci.c,v 1.26 2022/03/12 15:30:42 riastradh Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -787,7 +787,6 @@ vhci_usb_attach(vhci_fd_t *vfd)
 	vhci_port_t *port;
 	struct usbd_xfer *xfer;
 	u_char *p;
-	int ret = 0;
 
 	port = &sc->sc_port[vfd->port];
 
@@ -802,7 +801,6 @@ vhci_usb_attach(vhci_fd_t *vfd)
 	xfer = sc->sc_intrxfer;
 
 	if (xfer == NULL) {
-		ret = ENOBUFS;
 		goto done;
 	}
 	KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
@@ -821,7 +819,7 @@ vhci_usb_attach(vhci_fd_t *vfd)
 
 done:
 	mutex_exit(&sc->sc_lock);
-	return ret;
+	return 0;
 }
 
 static void
@@ -886,8 +884,7 @@ vhci_usb_detach(vhci_fd_t *vfd)
 
 	xfer = sc->sc_intrxfer;
 	if (xfer == NULL) {
-		mutex_exit(&sc->sc_lock);
-		return ENOBUFS;
+		goto done;
 	}
 	KASSERT(xfer->ux_status == USBD_IN_PROGRESS);
 
@@ -910,6 +907,7 @@ vhci_usb_detach(vhci_fd_t *vfd)
 	vhci_port_flush(sc, port);
 
 	mutex_exit(&port->lock);
+done:
 	mutex_exit(&sc->sc_lock);
 	return 0;
 }

Reply via email to