sunrpc: mark all struct svc_procinfo instances as const

struct svc_procinfo contains function pointers, and marking it as
constant avoids it being able to be used as an attach vector for
code injections.

Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
Christoph Hellwig 2017-05-12 16:11:49 +02:00
parent 7fd38af9ca
commit 860bda29b9
12 changed files with 15 additions and 15 deletions

View File

@ -507,7 +507,7 @@ struct nlm_void { int dummy; };
#define No (1+1024/4) /* netobj */ #define No (1+1024/4) /* netobj */
#define St 1 /* status */ #define St 1 /* status */
#define Rg 4 /* range (offset + length) */ #define Rg 4 /* range (offset + length) */
struct svc_procedure nlmsvc_procedures4[] = { const struct svc_procedure nlmsvc_procedures4[] = {
PROC(null, void, void, void, void, 1), PROC(null, void, void, void, void, 1),
PROC(test, testargs, testres, args, res, Ck+St+2+No+Rg), PROC(test, testargs, testres, args, res, Ck+St+2+No+Rg),
PROC(lock, lockargs, res, args, res, Ck+St), PROC(lock, lockargs, res, args, res, Ck+St),

View File

@ -551,7 +551,7 @@ struct nlm_void { int dummy; };
#define No (1+1024/4) /* Net Obj */ #define No (1+1024/4) /* Net Obj */
#define Rg 2 /* range - offset + size */ #define Rg 2 /* range - offset + size */
struct svc_procedure nlmsvc_procedures[] = { const struct svc_procedure nlmsvc_procedures[] = {
PROC(null, void, void, void, void, 1), PROC(null, void, void, void, void, 1),
PROC(test, testargs, testres, args, res, Ck+St+2+No+Rg), PROC(test, testargs, testres, args, res, Ck+St+2+No+Rg),
PROC(lock, lockargs, res, args, res, Ck+St), PROC(lock, lockargs, res, args, res, Ck+St),

View File

@ -995,7 +995,7 @@ static struct callback_op callback_ops[] = {
/* /*
* Define NFS4 callback procedures * Define NFS4 callback procedures
*/ */
static struct svc_procedure nfs4_callback_procedures1[] = { static const struct svc_procedure nfs4_callback_procedures1[] = {
[CB_NULL] = { [CB_NULL] = {
.pc_func = nfs4_callback_null, .pc_func = nfs4_callback_null,
.pc_decode = nfs4_decode_void, .pc_decode = nfs4_decode_void,

View File

@ -370,7 +370,7 @@ struct nfsd3_voidargs { int dummy; };
#define pAT (1+AT) /* post attributes - conditional */ #define pAT (1+AT) /* post attributes - conditional */
#define ACL (1+NFS_ACL_MAX_ENTRIES*3) /* Access Control List */ #define ACL (1+NFS_ACL_MAX_ENTRIES*3) /* Access Control List */
static struct svc_procedure nfsd_acl_procedures2[] = { static const struct svc_procedure nfsd_acl_procedures2[] = {
PROC(null, void, void, void, RC_NOCACHE, ST), PROC(null, void, void, void, RC_NOCACHE, ST),
PROC(getacl, getacl, getacl, getacl, RC_NOCACHE, ST+1+2*(1+ACL)), PROC(getacl, getacl, getacl, getacl, RC_NOCACHE, ST+1+2*(1+ACL)),
PROC(setacl, setacl, attrstat, attrstat, RC_NOCACHE, ST+AT), PROC(setacl, setacl, attrstat, attrstat, RC_NOCACHE, ST+AT),

View File

@ -257,7 +257,7 @@ struct nfsd3_voidargs { int dummy; };
#define pAT (1+AT) /* post attributes - conditional */ #define pAT (1+AT) /* post attributes - conditional */
#define ACL (1+NFS_ACL_MAX_ENTRIES*3) /* Access Control List */ #define ACL (1+NFS_ACL_MAX_ENTRIES*3) /* Access Control List */
static struct svc_procedure nfsd_acl_procedures3[] = { static const struct svc_procedure nfsd_acl_procedures3[] = {
PROC(null, void, void, void, RC_NOCACHE, ST), PROC(null, void, void, void, RC_NOCACHE, ST),
PROC(getacl, getacl, getacl, getacl, RC_NOCACHE, ST+1+2*(1+ACL)), PROC(getacl, getacl, getacl, getacl, RC_NOCACHE, ST+1+2*(1+ACL)),
PROC(setacl, setacl, setacl, fhandle, RC_NOCACHE, ST+pAT), PROC(setacl, setacl, setacl, fhandle, RC_NOCACHE, ST+pAT),

View File

@ -674,7 +674,7 @@ struct nfsd3_voidargs { int dummy; };
#define pAT (1+AT) /* post attributes - conditional */ #define pAT (1+AT) /* post attributes - conditional */
#define WC (7+pAT) /* WCC attributes */ #define WC (7+pAT) /* WCC attributes */
static struct svc_procedure nfsd_procedures3[22] = { static const struct svc_procedure nfsd_procedures3[22] = {
[NFS3PROC_NULL] = { [NFS3PROC_NULL] = {
.pc_func = nfsd3_proc_null, .pc_func = nfsd3_proc_null,
.pc_encode = nfs3svc_encode_voidres, .pc_encode = nfs3svc_encode_voidres,

View File

@ -2533,7 +2533,7 @@ static const char *nfsd4_op_name(unsigned opnum)
#define nfsd4_voidres nfsd4_voidargs #define nfsd4_voidres nfsd4_voidargs
struct nfsd4_voidargs { int dummy; }; struct nfsd4_voidargs { int dummy; };
static struct svc_procedure nfsd_procedures4[2] = { static const struct svc_procedure nfsd_procedures4[2] = {
[NFSPROC4_NULL] = { [NFSPROC4_NULL] = {
.pc_func = nfsd4_proc_null, .pc_func = nfsd4_proc_null,
.pc_encode = nfs4svc_encode_voidres, .pc_encode = nfs4svc_encode_voidres,

View File

@ -573,7 +573,7 @@ struct nfsd_void { int dummy; };
#define FH 8 /* filehandle */ #define FH 8 /* filehandle */
#define AT 18 /* attributes */ #define AT 18 /* attributes */
static struct svc_procedure nfsd_procedures2[18] = { static const struct svc_procedure nfsd_procedures2[18] = {
[NFSPROC_NULL] = { [NFSPROC_NULL] = {
.pc_func = nfsd_proc_null, .pc_func = nfsd_proc_null,
.pc_decode = nfssvc_decode_void, .pc_decode = nfssvc_decode_void,

View File

@ -756,7 +756,7 @@ static __be32 map_new_errors(u32 vers, __be32 nfserr)
* problem, we enforce these assumptions here: * problem, we enforce these assumptions here:
*/ */
static bool nfs_request_too_big(struct svc_rqst *rqstp, static bool nfs_request_too_big(struct svc_rqst *rqstp,
struct svc_procedure *proc) const struct svc_procedure *proc)
{ {
/* /*
* The ACL code has more careful bounds-checking and is not * The ACL code has more careful bounds-checking and is not
@ -781,7 +781,7 @@ static bool nfs_request_too_big(struct svc_rqst *rqstp,
int int
nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp) nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
{ {
struct svc_procedure *proc; const struct svc_procedure *proc;
__be32 nfserr; __be32 nfserr;
__be32 *nfserrp; __be32 *nfserrp;

View File

@ -192,9 +192,9 @@ struct nlm_block {
* Global variables * Global variables
*/ */
extern const struct rpc_program nlm_program; extern const struct rpc_program nlm_program;
extern struct svc_procedure nlmsvc_procedures[]; extern const struct svc_procedure nlmsvc_procedures[];
#ifdef CONFIG_LOCKD_V4 #ifdef CONFIG_LOCKD_V4
extern struct svc_procedure nlmsvc_procedures4[]; extern const struct svc_procedure nlmsvc_procedures4[];
#endif #endif
extern int nlmsvc_grace_period; extern int nlmsvc_grace_period;
extern unsigned long nlmsvc_timeout; extern unsigned long nlmsvc_timeout;

View File

@ -237,7 +237,7 @@ struct svc_rqst {
struct svc_serv * rq_server; /* RPC service definition */ struct svc_serv * rq_server; /* RPC service definition */
struct svc_pool * rq_pool; /* thread pool */ struct svc_pool * rq_pool; /* thread pool */
struct svc_procedure * rq_procinfo; /* procedure info */ const struct svc_procedure *rq_procinfo;/* procedure info */
struct auth_ops * rq_authop; /* authentication flavour */ struct auth_ops * rq_authop; /* authentication flavour */
struct svc_cred rq_cred; /* auth info */ struct svc_cred rq_cred; /* auth info */
void * rq_xprt_ctxt; /* transport specific context ptr */ void * rq_xprt_ctxt; /* transport specific context ptr */
@ -396,7 +396,7 @@ struct svc_program {
struct svc_version { struct svc_version {
u32 vs_vers; /* version number */ u32 vs_vers; /* version number */
u32 vs_nproc; /* number of procedures */ u32 vs_nproc; /* number of procedures */
struct svc_procedure * vs_proc; /* per-procedure info */ const struct svc_procedure *vs_proc; /* per-procedure info */
unsigned int *vs_count; /* call counts */ unsigned int *vs_count; /* call counts */
u32 vs_xdrsize; /* xdrsize needed for this version */ u32 vs_xdrsize; /* xdrsize needed for this version */

View File

@ -1152,7 +1152,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
{ {
struct svc_program *progp; struct svc_program *progp;
struct svc_version *versp = NULL; /* compiler food */ struct svc_version *versp = NULL; /* compiler food */
struct svc_procedure *procp = NULL; const struct svc_procedure *procp = NULL;
struct svc_serv *serv = rqstp->rq_server; struct svc_serv *serv = rqstp->rq_server;
__be32 *statp; __be32 *statp;
u32 prog, vers, proc; u32 prog, vers, proc;