sunrpc: Const-ify struct sv_serv_ops

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>
This commit is contained in:
Chuck Lever 2017-08-01 12:00:06 -04:00 committed by J. Bruce Fields
parent c1df609d9d
commit afea5657c2
5 changed files with 13 additions and 13 deletions

View File

@ -396,7 +396,7 @@ static int lockd_start_svc(struct svc_serv *serv)
return error; 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_shutdown = svc_rpcb_cleanup,
.svo_enqueue_xprt = svc_xprt_do_enqueue, .svo_enqueue_xprt = svc_xprt_do_enqueue,
}; };

View File

@ -226,26 +226,26 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
return ret; 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_function = nfs4_callback_svc,
.svo_enqueue_xprt = svc_xprt_do_enqueue, .svo_enqueue_xprt = svc_xprt_do_enqueue,
.svo_setup = svc_set_num_threads_sync, .svo_setup = svc_set_num_threads_sync,
.svo_module = THIS_MODULE, .svo_module = THIS_MODULE,
}; };
#if defined(CONFIG_NFS_V4_1) #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_function = nfs41_callback_svc,
.svo_enqueue_xprt = svc_xprt_do_enqueue, .svo_enqueue_xprt = svc_xprt_do_enqueue,
.svo_setup = svc_set_num_threads_sync, .svo_setup = svc_set_num_threads_sync,
.svo_module = THIS_MODULE, .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, [0] = &nfs40_cb_sv_ops,
[1] = &nfs41_cb_sv_ops, [1] = &nfs41_cb_sv_ops,
}; };
#else #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, [0] = &nfs40_cb_sv_ops,
[1] = NULL, [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) static struct svc_serv *nfs_callback_create_svc(int minorversion)
{ {
struct nfs_callback_data *cb_info = &nfs_callback_info[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 *serv;
struct svc_serv_ops *sv_ops;
/* /*
* Check whether we're already up and running. * Check whether we're already up and running.

View File

@ -475,7 +475,7 @@ static int nfsd_get_default_max_blksize(void)
return ret; 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_shutdown = nfsd_last_thread,
.svo_function = nfsd, .svo_function = nfsd,
.svo_enqueue_xprt = svc_xprt_do_enqueue, .svo_enqueue_xprt = svc_xprt_do_enqueue,

View File

@ -99,7 +99,7 @@ struct svc_serv {
unsigned int sv_nrpools; /* number of thread pools */ unsigned int sv_nrpools; /* number of thread pools */
struct svc_pool * sv_pools; /* array 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) #if defined(CONFIG_SUNRPC_BACKCHANNEL)
struct list_head sv_cb_list; /* queue for callback requests struct list_head sv_cb_list; /* queue for callback requests
* that arrive over the same * 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); void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net);
int svc_bind(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 *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_rqst *svc_rqst_alloc(struct svc_serv *serv,
struct svc_pool *pool, int node); struct svc_pool *pool, int node);
struct svc_rqst *svc_prepare_thread(struct svc_serv *serv, 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); unsigned int svc_pool_map_get(void);
void svc_pool_map_put(void); void svc_pool_map_put(void);
struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int, 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(struct svc_serv *, struct svc_pool *, int);
int svc_set_num_threads_sync(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); int svc_pool_stats_open(struct svc_serv *serv, struct file *file);

View File

@ -421,7 +421,7 @@ __svc_init_bc(struct svc_serv *serv)
*/ */
static struct svc_serv * static struct svc_serv *
__svc_create(struct svc_program *prog, unsigned int bufsize, int npools, __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; struct svc_serv *serv;
unsigned int vers; unsigned int vers;
@ -486,7 +486,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
struct svc_serv * struct svc_serv *
svc_create(struct svc_program *prog, unsigned int bufsize, 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); return __svc_create(prog, bufsize, /*npools*/1, ops);
} }
@ -494,7 +494,7 @@ EXPORT_SYMBOL_GPL(svc_create);
struct svc_serv * struct svc_serv *
svc_create_pooled(struct svc_program *prog, unsigned int bufsize, 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; struct svc_serv *serv;
unsigned int npools = svc_pool_map_get(); unsigned int npools = svc_pool_map_get();