|
@@ -2060,10 +2060,14 @@ static int unix_shutdown(struct socket *sock, int mode)
|
|
|
struct sock *sk = sock->sk;
|
|
|
struct sock *other;
|
|
|
|
|
|
- mode = (mode+1)&(RCV_SHUTDOWN|SEND_SHUTDOWN);
|
|
|
-
|
|
|
- if (!mode)
|
|
|
- return 0;
|
|
|
+ if (mode < SHUT_RD || mode > SHUT_RDWR)
|
|
|
+ return -EINVAL;
|
|
|
+ /* This maps:
|
|
|
+ * SHUT_RD (0) -> RCV_SHUTDOWN (1)
|
|
|
+ * SHUT_WR (1) -> SEND_SHUTDOWN (2)
|
|
|
+ * SHUT_RDWR (2) -> SHUTDOWN_MASK (3)
|
|
|
+ */
|
|
|
+ ++mode;
|
|
|
|
|
|
unix_state_lock(sk);
|
|
|
sk->sk_shutdown |= mode;
|