diff options
author | J. Bruce Fields <bfields@redhat.com> | 2012-03-27 14:50:26 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@redhat.com> | 2012-11-07 19:31:35 -0500 |
commit | acb2887e04c2140c2c63c8bf94e0b446efcc7001 (patch) | |
tree | 27f8546bda33ab32c3c13f3d6d2071697742928a /fs | |
parent | face15025ffdf664de95e86ae831544154d26c9c (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.c | 118 | ||||
-rw-r--r-- | fs/nfsd/state.h | 9 |
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 | ||
425 | static __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 | |||
425 | static __be32 nfsd4_decode_bind_conn_to_session(struct nfsd4_compoundargs *argp, struct nfsd4_bind_conn_to_session *bcts) | 486 | static __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 | ||
153 | struct nfsd4_cb_sec { | ||
154 | u32 uid; | ||
155 | u32 gid; | ||
156 | }; | ||
157 | |||
153 | struct nfsd4_create_session { | 158 | struct 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 | ||
165 | struct nfsd4_bind_conn_to_session { | 169 | struct 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; |