hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/net/can/isotp.c
....@@ -990,8 +990,9 @@
990990 /* wait for complete transmission of current pdu */
991991 wait_event_interruptible(so->wait, so->tx.state == ISOTP_IDLE);
992992
993
- if (sk->sk_err)
994
- return -sk->sk_err;
993
+ err = sock_error(sk);
994
+ if (err)
995
+ return err;
995996 }
996997
997998 return size;
....@@ -1016,7 +1017,7 @@
10161017 int noblock = flags & MSG_DONTWAIT;
10171018 int ret = 0;
10181019
1019
- if (flags & ~(MSG_DONTWAIT | MSG_TRUNC | MSG_PEEK))
1020
+ if (flags & ~(MSG_DONTWAIT | MSG_TRUNC | MSG_PEEK | MSG_CMSG_COMPAT))
10201021 return -EINVAL;
10211022
10221023 if (!so->bound)
....@@ -1480,6 +1481,21 @@
14801481 return 0;
14811482 }
14821483
1484
+static __poll_t isotp_poll(struct file *file, struct socket *sock, poll_table *wait)
1485
+{
1486
+ struct sock *sk = sock->sk;
1487
+ struct isotp_sock *so = isotp_sk(sk);
1488
+
1489
+ __poll_t mask = datagram_poll(file, sock, wait);
1490
+ poll_wait(file, &so->wait, wait);
1491
+
1492
+ /* Check for false positives due to TX state */
1493
+ if ((mask & EPOLLWRNORM) && (so->tx.state != ISOTP_IDLE))
1494
+ mask &= ~(EPOLLOUT | EPOLLWRNORM);
1495
+
1496
+ return mask;
1497
+}
1498
+
14831499 static int isotp_sock_no_ioctlcmd(struct socket *sock, unsigned int cmd,
14841500 unsigned long arg)
14851501 {
....@@ -1495,7 +1511,7 @@
14951511 .socketpair = sock_no_socketpair,
14961512 .accept = sock_no_accept,
14971513 .getname = isotp_getname,
1498
- .poll = datagram_poll,
1514
+ .poll = isotp_poll,
14991515 .ioctl = isotp_sock_no_ioctlcmd,
15001516 .gettstamp = sock_gettstamp,
15011517 .listen = sock_no_listen,