sunrpc: Const-ify instances of struct svc_xprt_ops
authorChuck Lever <chuck.lever@oracle.com>
Tue, 1 Aug 2017 15:59:49 +0000 (11:59 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Fri, 25 Aug 2017 02:13:50 +0000 (22:13 -0400)
Close an attack vector by moving the arrays of server-side transport
methods to read-only memory.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
include/linux/sunrpc/svc_xprt.h
net/sunrpc/svcsock.c
net/sunrpc/xprtrdma/svc_rdma_transport.c

index ddb7f94a9d06ecc48828b7b00230662b85768d64..6a2ad38f545896352ea91edb10f66ca9d44e7b93 100644 (file)
@@ -31,7 +31,7 @@ struct svc_xprt_ops {
 struct svc_xprt_class {
        const char              *xcl_name;
        struct module           *xcl_owner;
-       struct svc_xprt_ops     *xcl_ops;
+       const struct svc_xprt_ops *xcl_ops;
        struct list_head        xcl_list;
        u32                     xcl_max_payload;
        int                     xcl_ident;
@@ -49,7 +49,7 @@ struct svc_xpt_user {
 
 struct svc_xprt {
        struct svc_xprt_class   *xpt_class;
-       struct svc_xprt_ops     *xpt_ops;
+       const struct svc_xprt_ops *xpt_ops;
        struct kref             xpt_ref;
        struct list_head        xpt_list;
        struct list_head        xpt_ready;
index 2b720fa35c4ff7c2ae906e9e76d13d27a2b2f008..b434f524d6771738da9dd5279957be6c872c5f30 100644 (file)
@@ -687,7 +687,7 @@ static struct svc_xprt *svc_udp_create(struct svc_serv *serv,
        return svc_create_socket(serv, IPPROTO_UDP, net, sa, salen, flags);
 }
 
-static struct svc_xprt_ops svc_udp_ops = {
+static const struct svc_xprt_ops svc_udp_ops = {
        .xpo_create = svc_udp_create,
        .xpo_recvfrom = svc_udp_recvfrom,
        .xpo_sendto = svc_udp_sendto,
@@ -1229,7 +1229,7 @@ static void svc_bc_tcp_sock_detach(struct svc_xprt *xprt)
 {
 }
 
-static struct svc_xprt_ops svc_tcp_bc_ops = {
+static const struct svc_xprt_ops svc_tcp_bc_ops = {
        .xpo_create = svc_bc_tcp_create,
        .xpo_detach = svc_bc_tcp_sock_detach,
        .xpo_free = svc_bc_sock_free,
@@ -1263,7 +1263,7 @@ static void svc_cleanup_bc_xprt_sock(void)
 }
 #endif /* CONFIG_SUNRPC_BACKCHANNEL */
 
-static struct svc_xprt_ops svc_tcp_ops = {
+static const struct svc_xprt_ops svc_tcp_ops = {
        .xpo_create = svc_tcp_create,
        .xpo_recvfrom = svc_tcp_recvfrom,
        .xpo_sendto = svc_tcp_sendto,
index e660d4965b18aa2b40af11576405d4d14c283d9d..2aa8473dcc97dafdc63f3ea4dd3034fdf238932c 100644 (file)
@@ -70,7 +70,7 @@ static int svc_rdma_has_wspace(struct svc_xprt *xprt);
 static int svc_rdma_secure_port(struct svc_rqst *);
 static void svc_rdma_kill_temp_xprt(struct svc_xprt *);
 
-static struct svc_xprt_ops svc_rdma_ops = {
+static const struct svc_xprt_ops svc_rdma_ops = {
        .xpo_create = svc_rdma_create,
        .xpo_recvfrom = svc_rdma_recvfrom,
        .xpo_sendto = svc_rdma_sendto,
@@ -98,7 +98,7 @@ static struct svc_xprt *svc_rdma_bc_create(struct svc_serv *, struct net *,
 static void svc_rdma_bc_detach(struct svc_xprt *);
 static void svc_rdma_bc_free(struct svc_xprt *);
 
-static struct svc_xprt_ops svc_rdma_bc_ops = {
+static const struct svc_xprt_ops svc_rdma_bc_ops = {
        .xpo_create = svc_rdma_bc_create,
        .xpo_detach = svc_rdma_bc_detach,
        .xpo_free = svc_rdma_bc_free,