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:
parent
7fd38af9ca
commit
860bda29b9
|
@ -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),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue