aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorJ. Bruce Fields <bfields@redhat.com>2012-03-27 14:50:26 -0400
committerJ. Bruce Fields <bfields@redhat.com>2012-11-07 19:31:35 -0500
commitacb2887e04c2140c2c63c8bf94e0b446efcc7001 (patch)
tree27f8546bda33ab32c3c13f3d6d2071697742928a /fs
parentface15025ffdf664de95e86ae831544154d26c9c (diff)
nfsd4: clean up callback security parsing
Move the callback parsing into a separate function. Signed-off-by: J. Bruce Fields <bfields@redhat.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/nfsd/nfs4xdr.c118
-rw-r--r--fs/nfsd/state.h9
2 files changed, 70 insertions, 57 deletions
diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
index af65fda7685..511f980b605 100644
--- a/fs/nfsd/nfs4xdr.c
+++ b/fs/nfsd/nfs4xdr.c
@@ -422,6 +422,67 @@ nfsd4_decode_access(struct nfsd4_compoundargs *argp, struct nfsd4_access *access
422 DECODE_TAIL; 422 DECODE_TAIL;
423} 423}
424 424
425static __be32 nfsd4_decode_cb_sec(struct nfsd4_compoundargs *argp, struct nfsd4_cb_sec *cbs)
426{
427 DECODE_HEAD;
428 u32 dummy;
429 char *machine_name;
430 int i;
431 int nr_secflavs;
432
433 /* callback_sec_params4 */
434 READ_BUF(4);
435 READ32(nr_secflavs);
436 for (i = 0; i < nr_secflavs; ++i) {
437 READ_BUF(4);
438 READ32(dummy);
439 switch (dummy) {
440 case RPC_AUTH_NULL:
441 /* Nothing to read */
442 break;
443 case RPC_AUTH_UNIX:
444 READ_BUF(8);
445 /* stamp */
446 READ32(dummy);
447
448 /* machine name */
449 READ32(dummy);
450 READ_BUF(dummy);
451 SAVEMEM(machine_name, dummy);
452
453 /* uid, gid */
454 READ_BUF(8);
455 READ32(cbs->uid);
456 READ32(cbs->gid);
457
458 /* more gids */
459 READ_BUF(4);
460 READ32(dummy);
461 READ_BUF(dummy * 4);
462 break;
463 case RPC_AUTH_GSS:
464 dprintk("RPC_AUTH_GSS callback secflavor "
465 "not supported!\n");
466 READ_BUF(8);
467 /* gcbp_service */
468 READ32(dummy);
469 /* gcbp_handle_from_server */
470 READ32(dummy);
471 READ_BUF(dummy);
472 p += XDR_QUADLEN(dummy);
473 /* gcbp_handle_from_client */
474 READ_BUF(4);
475 READ32(dummy);
476 READ_BUF(dummy);
477 break;
478 default:
479 dprintk("Illegal callback secflavor\n");
480 return nfserr_inval;
481 }
482 }
483 DECODE_TAIL;
484}
485
425static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts) 486static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts)
426{ 487{
427 DECODE_HEAD; 488 DECODE_HEAD;
@@ -1237,11 +1298,7 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
1237 struct nfsd4_create_session *sess) 1298 struct nfsd4_create_session *sess)
1238{ 1299{
1239 DECODE_HEAD; 1300 DECODE_HEAD;
1240
1241 u32 dummy; 1301 u32 dummy;
1242 char *machine_name;
1243 int i;
1244 int nr_secflavs;
1245 1302
1246 READ_BUF(16); 1303 READ_BUF(16);
1247 COPYMEM(&sess->clientid, 8); 1304 COPYMEM(&sess->clientid, 8);
@@ -1282,58 +1339,9 @@ nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
1282 goto xdr_error; 1339 goto xdr_error;
1283 } 1340 }
1284 1341
1285 READ_BUF(8); 1342 READ_BUF(4);
1286 READ32(sess->callback_prog); 1343 READ32(sess->callback_prog);
1287 1344 nfsd4_decode_cb_sec(argp, &sess->cb_sec);
1288 /* callback_sec_params4 */
1289 READ32(nr_secflavs);
1290 for (i = 0; i < nr_secflavs; ++i) {
1291 READ_BUF(4);
1292 READ32(dummy);
1293 switch (dummy) {
1294 case RPC_AUTH_NULL:
1295 /* Nothing to read */
1296 break;
1297 case RPC_AUTH_UNIX:
1298 READ_BUF(8);
1299 /* stamp */
1300 READ32(dummy);
1301
1302 /* machine name */
1303 READ32(dummy);
1304 READ_BUF(dummy);
1305 SAVEMEM(machine_name, dummy);
1306
1307 /* uid, gid */
1308 READ_BUF(8);
1309 READ32(sess->uid);
1310 READ32(sess->gid);
1311
1312 /* more gids */
1313 READ_BUF(4);
1314 READ32(dummy);
1315 READ_BUF(dummy * 4);
1316 break;
1317 case RPC_AUTH_GSS:
1318 dprintk("RPC_AUTH_GSS callback secflavor "
1319 "not supported!\n");
1320 READ_BUF(8);
1321 /* gcbp_service */
1322 READ32(dummy);
1323 /* gcbp_handle_from_server */
1324 READ32(dummy);
1325 READ_BUF(dummy);
1326 p += XDR_QUADLEN(dummy);
1327 /* gcbp_handle_from_client */
1328 READ_BUF(4);
1329 READ32(dummy);
1330 READ_BUF(dummy);
1331 break;
1332 default:
1333 dprintk("Illegal callback secflavor\n");
1334 return nfserr_inval;
1335 }
1336 }
1337 DECODE_TAIL; 1345 DECODE_TAIL;
1338} 1346}
1339 1347
diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
index e036894bce5..df33e781f36 100644
--- a/fs/nfsd/state.h
+++ b/fs/nfsd/state.h
@@ -150,6 +150,11 @@ struct nfsd4_channel_attrs {
150 u32 rdma_attrs; 150 u32 rdma_attrs;
151}; 151};
152 152
153struct nfsd4_cb_sec {
154 u32 uid;
155 u32 gid;
156};
157
153struct nfsd4_create_session { 158struct nfsd4_create_session {
154 clientid_t clientid; 159 clientid_t clientid;
155 struct nfs4_sessionid sessionid; 160 struct nfs4_sessionid sessionid;
@@ -158,8 +163,7 @@ struct nfsd4_create_session {
158 struct nfsd4_channel_attrs fore_channel; 163 struct nfsd4_channel_attrs fore_channel;
159 struct nfsd4_channel_attrs back_channel; 164 struct nfsd4_channel_attrs back_channel;
160 u32 callback_prog; 165 u32 callback_prog;
161 u32 uid; 166 struct nfsd4_cb_sec cb_sec;
162 u32 gid;
163}; 167};
164 168
165struct nfsd4_bind_conn_to_session { 169struct nfsd4_bind_conn_to_session {
@@ -192,6 +196,7 @@ struct nfsd4_session {
192 struct nfs4_sessionid se_sessionid; 196 struct nfs4_sessionid se_sessionid;
193 struct nfsd4_channel_attrs se_fchannel; 197 struct nfsd4_channel_attrs se_fchannel;
194 struct nfsd4_channel_attrs se_bchannel; 198 struct nfsd4_channel_attrs se_bchannel;
199 struct nfsd4_cb_sec se_cb_sec;
195 struct list_head se_conns; 200 struct list_head se_conns;
196 u32 se_cb_prog; 201 u32 se_cb_prog;
197 u32 se_cb_seq_nr; 202 u32 se_cb_seq_nr;