net: make ->{get,set}sockopt in proto_ops optional
authorChristoph Hellwig <hch@lst.de>
Fri, 17 Jul 2020 06:23:31 +0000 (08:23 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Jul 2020 01:16:41 +0000 (18:16 -0700)
Just check for a NULL method instead of wiring up
sock_no_{get,set}sockopt.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
26 files changed:
crypto/af_alg.c
crypto/algif_aead.c
crypto/algif_hash.c
crypto/algif_rng.c
crypto/algif_skcipher.c
drivers/isdn/mISDN/socket.c
drivers/net/ppp/pppoe.c
drivers/net/ppp/pptp.c
include/net/sock.h
net/appletalk/ddp.c
net/bluetooth/bnep/sock.c
net/bluetooth/cmtp/sock.c
net/bluetooth/hidp/sock.c
net/caif/caif_socket.c
net/can/bcm.c
net/core/sock.c
net/key/af_key.c
net/nfc/llcp_sock.c
net/nfc/rawsock.c
net/packet/af_packet.c
net/phonet/socket.c
net/qrtr/qrtr.c
net/smc/af_smc.c
net/socket.c
net/unix/af_unix.c
net/vmw_vsock/af_vsock.c

index 28fc323e3fe3042bb169e29ed9a1024ef7c4c0c8..29f71428520b4b37cff2aea01e12f4269e74418e 100644 (file)
@@ -335,7 +335,6 @@ static const struct proto_ops alg_proto_ops = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .sendpage       =       sock_no_sendpage,
        .sendmsg        =       sock_no_sendmsg,
index 0ae000a61c7f5bf735934d87d8ec61c4537afe5f..527d09a694627b3c26cc2886ce97bdf3cf5613c2 100644 (file)
@@ -361,11 +361,9 @@ static struct proto_ops algif_aead_ops = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
        .accept         =       sock_no_accept,
-       .setsockopt     =       sock_no_setsockopt,
 
        .release        =       af_alg_release,
        .sendmsg        =       aead_sendmsg,
@@ -454,11 +452,9 @@ static struct proto_ops algif_aead_ops_nokey = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
        .accept         =       sock_no_accept,
-       .setsockopt     =       sock_no_setsockopt,
 
        .release        =       af_alg_release,
        .sendmsg        =       aead_sendmsg_nokey,
index e71727c25a7db7c82155e2a605969af7dd92dcc6..50f7b22f1b4825342bb1bebe13c7c26012953c58 100644 (file)
@@ -279,10 +279,8 @@ static struct proto_ops algif_hash_ops = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
-       .setsockopt     =       sock_no_setsockopt,
 
        .release        =       af_alg_release,
        .sendmsg        =       hash_sendmsg,
@@ -383,10 +381,8 @@ static struct proto_ops algif_hash_ops_nokey = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
-       .setsockopt     =       sock_no_setsockopt,
 
        .release        =       af_alg_release,
        .sendmsg        =       hash_sendmsg_nokey,
index 087c0ad09d382bdba07791610f0a81b172f1c1d3..6300e0566dc5602508c55a36d88bebfe2f6081eb 100644 (file)
@@ -101,11 +101,9 @@ static struct proto_ops algif_rng_ops = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
        .accept         =       sock_no_accept,
-       .setsockopt     =       sock_no_setsockopt,
        .sendmsg        =       sock_no_sendmsg,
        .sendpage       =       sock_no_sendpage,
 
index ec5567c87a6df4f61792585d45d3c835b6d2a78e..c487887f46711e39a797ed8f4b3504ef1007b4a4 100644 (file)
@@ -188,11 +188,9 @@ static struct proto_ops algif_skcipher_ops = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
        .accept         =       sock_no_accept,
-       .setsockopt     =       sock_no_setsockopt,
 
        .release        =       af_alg_release,
        .sendmsg        =       skcipher_sendmsg,
@@ -281,11 +279,9 @@ static struct proto_ops algif_skcipher_ops_nokey = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .bind           =       sock_no_bind,
        .accept         =       sock_no_accept,
-       .setsockopt     =       sock_no_setsockopt,
 
        .release        =       af_alg_release,
        .sendmsg        =       skcipher_sendmsg_nokey,
index dff4132b3702c62ecebe24f3ad0fa0da1ca0c049..1b2b91479107bc4206d9cef692053559e8ca0924 100644 (file)
@@ -738,8 +738,6 @@ static const struct proto_ops base_sock_ops = {
        .recvmsg        = sock_no_recvmsg,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .connect        = sock_no_connect,
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
index beedaad082551b89a90f8c41ca78fb8a312a5099..d7f50b835050d16494f2030e158212e44f8094f2 100644 (file)
@@ -1110,8 +1110,6 @@ static const struct proto_ops pppoe_ops = {
        .poll           = datagram_poll,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .sendmsg        = pppoe_sendmsg,
        .recvmsg        = pppoe_recvmsg,
        .mmap           = sock_no_mmap,
index acccb747aedad6e4b5d82f16df78cfbe1fa529fb..ee5058445d06e265426385aa8cb9ef3373a69fee 100644 (file)
@@ -618,8 +618,6 @@ static const struct proto_ops pptp_ops = {
        .getname    = pptp_getname,
        .listen     = sock_no_listen,
        .shutdown   = sock_no_shutdown,
-       .setsockopt = sock_no_setsockopt,
-       .getsockopt = sock_no_getsockopt,
        .sendmsg    = sock_no_sendmsg,
        .recvmsg    = sock_no_recvmsg,
        .mmap       = sock_no_mmap,
index 3bd8bc578bf3e599d606675f08e8dd731b8873d1..62e18fc8ac9f96926bcfa2071d9577a59895680c 100644 (file)
@@ -1714,8 +1714,6 @@ int sock_no_getname(struct socket *, struct sockaddr *, int);
 int sock_no_ioctl(struct socket *, unsigned int, unsigned long);
 int sock_no_listen(struct socket *, int);
 int sock_no_shutdown(struct socket *, int);
-int sock_no_getsockopt(struct socket *, int , int, char __user *, int __user *);
-int sock_no_setsockopt(struct socket *, int, int, char __user *, unsigned int);
 int sock_no_sendmsg(struct socket *, struct msghdr *, size_t);
 int sock_no_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t len);
 int sock_no_recvmsg(struct socket *, struct msghdr *, size_t, int);
index 15787e8c0629a094e88f0a4205173985ce0ef30e..1d48708c5a2eb5bfb9d58fc8cd0dea469f4519d1 100644 (file)
@@ -1917,8 +1917,6 @@ static const struct proto_ops atalk_dgram_ops = {
 #endif
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .sendmsg        = atalk_sendmsg,
        .recvmsg        = atalk_recvmsg,
        .mmap           = sock_no_mmap,
index cfd83c5521aeccafc3ae119ac9df22ba0bedad8a..d515571b2afba933b1fa0614e1cc998a572e16ef 100644 (file)
@@ -182,8 +182,6 @@ static const struct proto_ops bnep_sock_ops = {
        .recvmsg        = sock_no_recvmsg,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .connect        = sock_no_connect,
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
index defdd4871919f33471d19813ee85ec4fcfeb6265..96d49d9fae9643807aa601e7139f3f2dd808a1cf 100644 (file)
@@ -185,8 +185,6 @@ static const struct proto_ops cmtp_sock_ops = {
        .recvmsg        = sock_no_recvmsg,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .connect        = sock_no_connect,
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
index 03be6a4baef30e8121d6fe087274f20fe55f37e3..595fb3c9d6c36172b1ea09f96e80bdbd075929df 100644 (file)
@@ -233,8 +233,6 @@ static const struct proto_ops hidp_sock_ops = {
        .recvmsg        = sock_no_recvmsg,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .connect        = sock_no_connect,
        .socketpair     = sock_no_socketpair,
        .accept         = sock_no_accept,
index ef14da50a9819183c538f14b97b5e4986adafb45..b94ecd931002e7eb1889be8dd76740e5fb96c2b0 100644 (file)
@@ -981,7 +981,6 @@ static const struct proto_ops caif_seqpacket_ops = {
        .listen = sock_no_listen,
        .shutdown = sock_no_shutdown,
        .setsockopt = setsockopt,
-       .getsockopt = sock_no_getsockopt,
        .sendmsg = caif_seqpkt_sendmsg,
        .recvmsg = caif_seqpkt_recvmsg,
        .mmap = sock_no_mmap,
@@ -1002,7 +1001,6 @@ static const struct proto_ops caif_stream_ops = {
        .listen = sock_no_listen,
        .shutdown = sock_no_shutdown,
        .setsockopt = setsockopt,
-       .getsockopt = sock_no_getsockopt,
        .sendmsg = caif_stream_sendmsg,
        .recvmsg = caif_stream_recvmsg,
        .mmap = sock_no_mmap,
index c96fa0f33db39c1e4143b5cfc2a080b72d3e1885..d14ea12affb112edb980cd783fe62d7bacad20eb 100644 (file)
@@ -1648,8 +1648,6 @@ static const struct proto_ops bcm_ops = {
        .gettstamp     = sock_gettstamp,
        .listen        = sock_no_listen,
        .shutdown      = sock_no_shutdown,
-       .setsockopt    = sock_no_setsockopt,
-       .getsockopt    = sock_no_getsockopt,
        .sendmsg       = bcm_sendmsg,
        .recvmsg       = bcm_recvmsg,
        .mmap          = sock_no_mmap,
index 48655d5c4cf37a7eb60f4a17abe4d1b42dfb2dd1..d828bfe1c47dfaab4359de162b0045ac86f51e7f 100644 (file)
@@ -2783,20 +2783,6 @@ int sock_no_shutdown(struct socket *sock, int how)
 }
 EXPORT_SYMBOL(sock_no_shutdown);
 
-int sock_no_setsockopt(struct socket *sock, int level, int optname,
-                   char __user *optval, unsigned int optlen)
-{
-       return -EOPNOTSUPP;
-}
-EXPORT_SYMBOL(sock_no_setsockopt);
-
-int sock_no_getsockopt(struct socket *sock, int level, int optname,
-                   char __user *optval, int __user *optlen)
-{
-       return -EOPNOTSUPP;
-}
-EXPORT_SYMBOL(sock_no_getsockopt);
-
 int sock_no_sendmsg(struct socket *sock, struct msghdr *m, size_t len)
 {
        return -EOPNOTSUPP;
index b67ed3a8486c259b33a79bf4758aa1a16e972705..f13626c1a9859284e6315497fe6db326ae567328 100644 (file)
@@ -3734,8 +3734,6 @@ static const struct proto_ops pfkey_ops = {
        .ioctl          =       sock_no_ioctl,
        .listen         =       sock_no_listen,
        .shutdown       =       sock_no_shutdown,
-       .setsockopt     =       sock_no_setsockopt,
-       .getsockopt     =       sock_no_getsockopt,
        .mmap           =       sock_no_mmap,
        .sendpage       =       sock_no_sendpage,
 
index 28604414dec1b7d03f0d175cc87c10e0922c7043..6da1e2334bb697edd4ef5fca03d211f5f245ffcb 100644 (file)
@@ -921,8 +921,6 @@ static const struct proto_ops llcp_rawsock_ops = {
        .ioctl          = sock_no_ioctl,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .sendmsg        = sock_no_sendmsg,
        .recvmsg        = llcp_sock_recvmsg,
        .mmap           = sock_no_mmap,
index ba5ffd3badd3244b70e9098a85594c65917a25a2..b2061b6746eaa614f7e61cb6ead037dd6c547931 100644 (file)
@@ -276,8 +276,6 @@ static const struct proto_ops rawsock_ops = {
        .ioctl          = sock_no_ioctl,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .sendmsg        = rawsock_sendmsg,
        .recvmsg        = rawsock_recvmsg,
        .mmap           = sock_no_mmap,
@@ -296,8 +294,6 @@ static const struct proto_ops rawsock_raw_ops = {
        .ioctl          = sock_no_ioctl,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .sendmsg        = sock_no_sendmsg,
        .recvmsg        = rawsock_recvmsg,
        .mmap           = sock_no_mmap,
index 35aee9e980536d81155d002b4a0dd937d5c20586..c240fb5de3f01452ca504f926a1314ad3aa4dac5 100644 (file)
@@ -4503,8 +4503,6 @@ static const struct proto_ops packet_ops_spkt = {
        .gettstamp =    sock_gettstamp,
        .listen =       sock_no_listen,
        .shutdown =     sock_no_shutdown,
-       .setsockopt =   sock_no_setsockopt,
-       .getsockopt =   sock_no_getsockopt,
        .sendmsg =      packet_sendmsg_spkt,
        .recvmsg =      packet_recvmsg,
        .mmap =         sock_no_mmap,
index 87c60f83c18061d154b122aca2a12d83095c02e0..2599235d592e0bab2c0201929d2090d3658aee3c 100644 (file)
@@ -439,8 +439,6 @@ const struct proto_ops phonet_dgram_ops = {
        .ioctl          = pn_socket_ioctl,
        .listen         = sock_no_listen,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .sendmsg        = pn_socket_sendmsg,
        .recvmsg        = sock_common_recvmsg,
        .mmap           = sock_no_mmap,
index 24a8c3c6da0dcaa43837e2f9efd117dacf5e856f..0cb4adfc6641da0b1add7a8b40957fd23df1e075 100644 (file)
@@ -1208,8 +1208,6 @@ static const struct proto_ops qrtr_proto_ops = {
        .gettstamp      = sock_gettstamp,
        .poll           = datagram_poll,
        .shutdown       = sock_no_shutdown,
-       .setsockopt     = sock_no_setsockopt,
-       .getsockopt     = sock_no_getsockopt,
        .release        = qrtr_release,
        .mmap           = sock_no_mmap,
        .sendpage       = sock_no_sendpage,
index 9033215438384b8f4a8b9872184c082d58c5afeb..9711c9e0e515bff3ad5f44d2266faf030cbe4862 100644 (file)
@@ -1742,8 +1742,11 @@ static int smc_setsockopt(struct socket *sock, int level, int optname,
        /* generic setsockopts reaching us here always apply to the
         * CLC socket
         */
-       rc = smc->clcsock->ops->setsockopt(smc->clcsock, level, optname,
-                                          optval, optlen);
+       if (unlikely(!smc->clcsock->ops->setsockopt))
+               rc = -EOPNOTSUPP;
+       else
+               rc = smc->clcsock->ops->setsockopt(smc->clcsock, level, optname,
+                                                  optval, optlen);
        if (smc->clcsock->sk->sk_err) {
                sk->sk_err = smc->clcsock->sk->sk_err;
                sk->sk_error_report(sk);
@@ -1808,6 +1811,8 @@ static int smc_getsockopt(struct socket *sock, int level, int optname,
 
        smc = smc_sk(sock->sk);
        /* socket options apply to the CLC socket */
+       if (unlikely(!smc->clcsock->ops->getsockopt))
+               return -EOPNOTSUPP;
        return smc->clcsock->ops->getsockopt(smc->clcsock, level, optname,
                                             optval, optlen);
 }
index dec345982abbb62b0a9bbcbbd077c422a425bf93..93846568c2fb7abecc5f0ba79e519f59c579de22 100644 (file)
@@ -2131,6 +2131,8 @@ int __sys_setsockopt(int fd, int level, int optname, char __user *optval,
 
        if (level == SOL_SOCKET && !sock_use_custom_sol_socket(sock))
                err = sock_setsockopt(sock, level, optname, optval, optlen);
+       else if (unlikely(!sock->ops->setsockopt))
+               err = -EOPNOTSUPP;
        else
                err = sock->ops->setsockopt(sock, level, optname, optval,
                                            optlen);
@@ -2175,6 +2177,8 @@ int __sys_getsockopt(int fd, int level, int optname, char __user *optval,
 
        if (level == SOL_SOCKET)
                err = sock_getsockopt(sock, level, optname, optval, optlen);
+       else if (unlikely(!sock->ops->getsockopt))
+               err = -EOPNOTSUPP;
        else
                err = sock->ops->getsockopt(sock, level, optname, optval,
                                            optlen);
index 3385a7a0b231339f758cddd7cb1f4cb5ed2c3117..181ea6fb56a617e722d9bf617c127fbc3ef73ddd 100644 (file)
@@ -714,8 +714,6 @@ static const struct proto_ops unix_stream_ops = {
 #endif
        .listen =       unix_listen,
        .shutdown =     unix_shutdown,
-       .setsockopt =   sock_no_setsockopt,
-       .getsockopt =   sock_no_getsockopt,
        .sendmsg =      unix_stream_sendmsg,
        .recvmsg =      unix_stream_recvmsg,
        .mmap =         sock_no_mmap,
@@ -741,8 +739,6 @@ static const struct proto_ops unix_dgram_ops = {
 #endif
        .listen =       sock_no_listen,
        .shutdown =     unix_shutdown,
-       .setsockopt =   sock_no_setsockopt,
-       .getsockopt =   sock_no_getsockopt,
        .sendmsg =      unix_dgram_sendmsg,
        .recvmsg =      unix_dgram_recvmsg,
        .mmap =         sock_no_mmap,
@@ -767,8 +763,6 @@ static const struct proto_ops unix_seqpacket_ops = {
 #endif
        .listen =       unix_listen,
        .shutdown =     unix_shutdown,
-       .setsockopt =   sock_no_setsockopt,
-       .getsockopt =   sock_no_getsockopt,
        .sendmsg =      unix_seqpacket_sendmsg,
        .recvmsg =      unix_seqpacket_recvmsg,
        .mmap =         sock_no_mmap,
index 626bf9044418cc78eef4da904334f5dfc87b458c..df204c6761c453008488fe02c608e739af3dd25f 100644 (file)
@@ -1202,8 +1202,6 @@ static const struct proto_ops vsock_dgram_ops = {
        .ioctl = sock_no_ioctl,
        .listen = sock_no_listen,
        .shutdown = vsock_shutdown,
-       .setsockopt = sock_no_setsockopt,
-       .getsockopt = sock_no_getsockopt,
        .sendmsg = vsock_dgram_sendmsg,
        .recvmsg = vsock_dgram_recvmsg,
        .mmap = sock_no_mmap,