Commit acb2887e authored by J. Bruce Fields's avatar J. Bruce Fields

nfsd4: clean up callback security parsing

Move the callback parsing into a separate function.
Signed-off-by: default avatarJ. Bruce Fields <bfields@redhat.com>
parent face1502
...@@ -422,6 +422,67 @@ nfsd4_decode_access(struct nfsd4_compoundargs *argp, struct nfsd4_access *access ...@@ -422,6 +422,67 @@ nfsd4_decode_access(struct nfsd4_compoundargs *argp, struct nfsd4_access *access
DECODE_TAIL; DECODE_TAIL;
} }
static __be32 nfsd4_decode_cb_sec(struct nfsd4_compoundargs *argp, struct nfsd4_cb_sec *cbs)
{
DECODE_HEAD;
u32 dummy;
char *machine_name;
int i;
int nr_secflavs;
/* callback_sec_params4 */
READ_BUF(4);
READ32(nr_secflavs);
for (i = 0; i < nr_secflavs; ++i) {
READ_BUF(4);
READ32(dummy);
switch (dummy) {
case RPC_AUTH_NULL:
/* Nothing to read */
break;
case RPC_AUTH_UNIX:
READ_BUF(8);
/* stamp */
READ32(dummy);
/* machine name */
READ32(dummy);
READ_BUF(dummy);
SAVEMEM(machine_name, dummy);
/* uid, gid */
READ_BUF(8);
READ32(cbs->uid);
READ32(cbs->gid);
/* more gids */
READ_BUF(4);
READ32(dummy);
READ_BUF(dummy * 4);
break;
case RPC_AUTH_GSS:
dprintk("RPC_AUTH_GSS callback secflavor "
"not supported!\n");
READ_BUF(8);
/* gcbp_service */
READ32(dummy);
/* gcbp_handle_from_server */
READ32(dummy);
READ_BUF(dummy);
p += XDR_QUADLEN(dummy);
/* gcbp_handle_from_client */
READ_BUF(4);
READ32(dummy);
READ_BUF(dummy);
break;
default:
dprintk("Illegal callback secflavor\n");
return nfserr_inval;
}
}
DECODE_TAIL;
}
static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts) static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts)
{ {
DECODE_HEAD; DECODE_HEAD;
...@@ -1237,11 +1298,7 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp, ...@@ -1237,11 +1298,7 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
struct nfsd4_create_session *sess) struct nfsd4_create_session *sess)
{ {
DECODE_HEAD; DECODE_HEAD;
u32 dummy; u32 dummy;
char *machine_name;
int i;
int nr_secflavs;
READ_BUF(16); READ_BUF(16);
COPYMEM(&sess->clientid, 8); COPYMEM(&sess->clientid, 8);
...@@ -1282,58 +1339,9 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp, ...@@ -1282,58 +1339,9 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
goto xdr_error; goto xdr_error;
} }
READ_BUF(8); READ_BUF(4);
READ32(sess->callback_prog); READ32(sess->callback_prog);
nfsd4_decode_cb_sec(argp, &sess->cb_sec);
/* callback_sec_params4 */
READ32(nr_secflavs);
for (i = 0; i < nr_secflavs; ++i) {
READ_BUF(4);
READ32(dummy);
switch (dummy) {
case RPC_AUTH_NULL:
/* Nothing to read */
break;
case RPC_AUTH_UNIX:
READ_BUF(8);
/* stamp */
READ32(dummy);
/* machine name */
READ32(dummy);
READ_BUF(dummy);
SAVEMEM(machine_name, dummy);
/* uid, gid */
READ_BUF(8);
READ32(sess->uid);
READ32(sess->gid);
/* more gids */
READ_BUF(4);
READ32(dummy);
READ_BUF(dummy * 4);
break;
case RPC_AUTH_GSS:
dprintk("RPC_AUTH_GSS callback secflavor "
"not supported!\n");
READ_BUF(8);
/* gcbp_service */
READ32(dummy);
/* gcbp_handle_from_server */
READ32(dummy);
READ_BUF(dummy);
p += XDR_QUADLEN(dummy);
/* gcbp_handle_from_client */
READ_BUF(4);
READ32(dummy);
READ_BUF(dummy);
break;
default:
dprintk("Illegal callback secflavor\n");
return nfserr_inval;
}
}
DECODE_TAIL; DECODE_TAIL;
} }
......
...@@ -150,6 +150,11 @@ struct nfsd4_channel_attrs { ...@@ -150,6 +150,11 @@ struct nfsd4_channel_attrs {
u32 rdma_attrs; u32 rdma_attrs;
}; };
struct nfsd4_cb_sec {
u32 uid;
u32 gid;
};
struct nfsd4_create_session { struct nfsd4_create_session {
clientid_t clientid; clientid_t clientid;
struct nfs4_sessionid sessionid; struct nfs4_sessionid sessionid;
...@@ -158,8 +163,7 @@ struct nfsd4_create_session { ...@@ -158,8 +163,7 @@ struct nfsd4_create_session {
struct nfsd4_channel_attrs fore_channel; struct nfsd4_channel_attrs fore_channel;
struct nfsd4_channel_attrs back_channel; struct nfsd4_channel_attrs back_channel;
u32 callback_prog; u32 callback_prog;
u32 uid; struct nfsd4_cb_sec cb_sec;
u32 gid;
}; };
struct nfsd4_bind_conn_to_session { struct nfsd4_bind_conn_to_session {
...@@ -192,6 +196,7 @@ struct nfsd4_session { ...@@ -192,6 +196,7 @@ struct nfsd4_session {
struct nfs4_sessionid se_sessionid; struct nfs4_sessionid se_sessionid;
struct nfsd4_channel_attrs se_fchannel; struct nfsd4_channel_attrs se_fchannel;
struct nfsd4_channel_attrs se_bchannel; struct nfsd4_channel_attrs se_bchannel;
struct nfsd4_cb_sec se_cb_sec;
struct list_head se_conns; struct list_head se_conns;
u32 se_cb_prog; u32 se_cb_prog;
u32 se_cb_seq_nr; u32 se_cb_seq_nr;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment