aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2021-10-13 23:43:06 +0000
committerBrooks Davis <brooks@FreeBSD.org>2021-10-13 23:43:48 +0000
commit04c91ac48ad13ce0d1392cedbd69c2c0223d206f (patch)
treef54e2dfde3ebc00603897ec2260ff744d2065ca6
parenta524aaf68341d9f83a0ef7dc21ad54728ddaaa1e (diff)
downloadsrc-04c91ac48ad13ce0d1392cedbd69c2c0223d206f.tar.gz
src-04c91ac48ad13ce0d1392cedbd69c2c0223d206f.zip
selsocket: handle sopoll() errors correctly
Without this change, unmounting smbfs filesystems with an INVARIANTS kernel would panic after 10e64782ed59727e8c9fe4a5c7e17f497903c8eb. Found by: markj Reviewed by: markj, jhb Obtained from: CheriBSD MFC after: 3 days Sponsored by: DARPA Differential Revision: https://reviews.freebsd.org/D32492
-rw-r--r--sys/kern/sys_generic.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index e6b2cba27a04..41e9c556f73f 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -1794,10 +1794,10 @@ selsocket(struct socket *so, int events, struct timeval *tvp, struct thread *td)
*/
for (;;) {
selfdalloc(td, NULL);
- error = sopoll(so, events, NULL, td);
- /* error here is actually the ready events. */
- if (error)
- return (0);
+ if (sopoll(so, events, NULL, td) != 0) {
+ error = 0;
+ break;
+ }
error = seltdwait(td, asbt, precision);
if (error)
break;