sunrpc: Const-ify struct sv_serv_ops
authorChuck Lever <chuck.lever@oracle.com>
Tue, 1 Aug 2017 16:00:06 +0000 (12:00 -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 per-server methods to
read-only memory.

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/lockd/svc.c
fs/nfs/callback.c
fs/nfsd/nfssvc.c
include/linux/sunrpc/svc.h
net/sunrpc/svc.c

index 726b6ce..b995bdc 100644 (file)
@@ -396,7 +396,7 @@ out_rqst:
        return error;
 }
 
-static struct svc_serv_ops lockd_sv_ops = {
+static const struct svc_serv_ops lockd_sv_ops = {
        .svo_shutdown           = svc_rpcb_cleanup,
        .svo_enqueue_xprt       = svc_xprt_do_enqueue,
 };
index 3432387..2cddf7f 100644 (file)
@@ -226,26 +226,26 @@ err_bind:
        return ret;
 }
 
-static struct svc_serv_ops nfs40_cb_sv_ops = {
+static const struct svc_serv_ops nfs40_cb_sv_ops = {
        .svo_function           = nfs4_callback_svc,
        .svo_enqueue_xprt       = svc_xprt_do_enqueue,
        .svo_setup              = svc_set_num_threads_sync,
        .svo_module             = THIS_MODULE,
 };
 #if defined(CONFIG_NFS_V4_1)
-static struct svc_serv_ops nfs41_cb_sv_ops = {
+static const struct svc_serv_ops nfs41_cb_sv_ops = {
        .svo_function           = nfs41_callback_svc,
        .svo_enqueue_xprt       = svc_xprt_do_enqueue,
        .svo_setup              = svc_set_num_threads_sync,
        .svo_module             = THIS_MODULE,
 };
 
-static struct svc_serv_ops *nfs4_cb_sv_ops[] = {
+static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
        [0] = &nfs40_cb_sv_ops,
        [1] = &nfs41_cb_sv_ops,
 };
 #else
-static struct svc_serv_ops *nfs4_cb_sv_ops[] = {
+static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
        [0] = &nfs40_cb_sv_ops,
        [1] = NULL,
 };
@@ -254,8 +254,8 @@ static struct svc_serv_ops *nfs4_cb_sv_ops[] = {
 static struct svc_serv *nfs_callback_create_svc(int minorversion)
 {
        struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
+       const struct svc_serv_ops *sv_ops;
        struct svc_serv *serv;
-       struct svc_serv_ops *sv_ops;
 
        /*
         * Check whether we're already up and running.
index 063ae7d..7e3af3e 100644 (file)
@@ -475,7 +475,7 @@ static int nfsd_get_default_max_blksize(void)
        return ret;
 }
 
-static struct svc_serv_ops nfsd_thread_sv_ops = {
+static const struct svc_serv_ops nfsd_thread_sv_ops = {
        .svo_shutdown           = nfsd_last_thread,
        .svo_function           = nfsd,
        .svo_enqueue_xprt       = svc_xprt_do_enqueue,
index a3f8af9..38f561b 100644 (file)
@@ -99,7 +99,7 @@ struct svc_serv {
 
        unsigned int            sv_nrpools;     /* number of thread pools */
        struct svc_pool *       sv_pools;       /* array of thread pools */
-       struct svc_serv_ops     *sv_ops;        /* server operations */
+       const struct svc_serv_ops *sv_ops;      /* server operations */
 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
        struct list_head        sv_cb_list;     /* queue for callback requests
                                                 * that arrive over the same
@@ -465,7 +465,7 @@ int svc_rpcb_setup(struct svc_serv *serv, struct net *net);
 void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net);
 int svc_bind(struct svc_serv *serv, struct net *net);
 struct svc_serv *svc_create(struct svc_program *, unsigned int,
-                           struct svc_serv_ops *);
+                           const struct svc_serv_ops *);
 struct svc_rqst *svc_rqst_alloc(struct svc_serv *serv,
                                        struct svc_pool *pool, int node);
 struct svc_rqst *svc_prepare_thread(struct svc_serv *serv,
@@ -475,7 +475,7 @@ void                   svc_exit_thread(struct svc_rqst *);
 unsigned int      svc_pool_map_get(void);
 void              svc_pool_map_put(void);
 struct svc_serv *  svc_create_pooled(struct svc_program *, unsigned int,
-                       struct svc_serv_ops *);
+                       const struct svc_serv_ops *);
 int               svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
 int               svc_set_num_threads_sync(struct svc_serv *, struct svc_pool *, int);
 int               svc_pool_stats_open(struct svc_serv *serv, struct file *file);
index 85ce0db..aa04666 100644 (file)
@@ -421,7 +421,7 @@ __svc_init_bc(struct svc_serv *serv)
  */
 static struct svc_serv *
 __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
-            struct svc_serv_ops *ops)
+            const struct svc_serv_ops *ops)
 {
        struct svc_serv *serv;
        unsigned int vers;
@@ -486,7 +486,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
 
 struct svc_serv *
 svc_create(struct svc_program *prog, unsigned int bufsize,
-          struct svc_serv_ops *ops)
+          const struct svc_serv_ops *ops)
 {
        return __svc_create(prog, bufsize, /*npools*/1, ops);
 }
@@ -494,7 +494,7 @@ EXPORT_SYMBOL_GPL(svc_create);
 
 struct svc_serv *
 svc_create_pooled(struct svc_program *prog, unsigned int bufsize,
-                 struct svc_serv_ops *ops)
+                 const struct svc_serv_ops *ops)
 {
        struct svc_serv *serv;
        unsigned int npools = svc_pool_map_get();