diff options
-rw-r--r-- | fs/nfs/client.c | 2 | ||||
-rw-r--r-- | fs/nfsd/nfs4callback.c | 2 | ||||
-rw-r--r-- | include/linux/sunrpc/auth.h | 3 | ||||
-rw-r--r-- | include/linux/sunrpc/auth_gss.h | 2 | ||||
-rw-r--r-- | net/sunrpc/auth_generic.c | 6 | ||||
-rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 40 |
6 files changed, 32 insertions, 23 deletions
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index 873bf00d51a2..32ea37198e93 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -185,7 +185,7 @@ static struct nfs_client *nfs_alloc_client(const struct nfs_client_initdata *cl_ | |||
185 | clp->cl_minorversion = cl_init->minorversion; | 185 | clp->cl_minorversion = cl_init->minorversion; |
186 | clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; | 186 | clp->cl_mvops = nfs_v4_minor_ops[cl_init->minorversion]; |
187 | #endif | 187 | #endif |
188 | cred = rpc_lookup_machine_cred(); | 188 | cred = rpc_lookup_machine_cred("*"); |
189 | if (!IS_ERR(cred)) | 189 | if (!IS_ERR(cred)) |
190 | clp->cl_machine_cred = cred; | 190 | clp->cl_machine_cred = cred; |
191 | nfs_fscache_get_client_cookie(clp); | 191 | nfs_fscache_get_client_cookie(clp); |
diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 7748d6a18d97..6f3ebb48b12f 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c | |||
@@ -718,7 +718,7 @@ int set_callback_cred(void) | |||
718 | { | 718 | { |
719 | if (callback_cred) | 719 | if (callback_cred) |
720 | return 0; | 720 | return 0; |
721 | callback_cred = rpc_lookup_machine_cred(); | 721 | callback_cred = rpc_lookup_machine_cred("nfs"); |
722 | if (!callback_cred) | 722 | if (!callback_cred) |
723 | return -ENOMEM; | 723 | return -ENOMEM; |
724 | return 0; | 724 | return 0; |
diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index febc4dbec2ca..7874a8a56638 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h | |||
@@ -26,6 +26,7 @@ struct auth_cred { | |||
26 | uid_t uid; | 26 | uid_t uid; |
27 | gid_t gid; | 27 | gid_t gid; |
28 | struct group_info *group_info; | 28 | struct group_info *group_info; |
29 | const char *principal; | ||
29 | unsigned char machine_cred : 1; | 30 | unsigned char machine_cred : 1; |
30 | }; | 31 | }; |
31 | 32 | ||
@@ -127,7 +128,7 @@ void rpc_destroy_generic_auth(void); | |||
127 | void rpc_destroy_authunix(void); | 128 | void rpc_destroy_authunix(void); |
128 | 129 | ||
129 | struct rpc_cred * rpc_lookup_cred(void); | 130 | struct rpc_cred * rpc_lookup_cred(void); |
130 | struct rpc_cred * rpc_lookup_machine_cred(void); | 131 | struct rpc_cred * rpc_lookup_machine_cred(const char *service_name); |
131 | int rpcauth_register(const struct rpc_authops *); | 132 | int rpcauth_register(const struct rpc_authops *); |
132 | int rpcauth_unregister(const struct rpc_authops *); | 133 | int rpcauth_unregister(const struct rpc_authops *); |
133 | struct rpc_auth * rpcauth_create(rpc_authflavor_t, struct rpc_clnt *); | 134 | struct rpc_auth * rpcauth_create(rpc_authflavor_t, struct rpc_clnt *); |
diff --git a/include/linux/sunrpc/auth_gss.h b/include/linux/sunrpc/auth_gss.h index 8eee9dbbfe7a..f1cfd4c85cd0 100644 --- a/include/linux/sunrpc/auth_gss.h +++ b/include/linux/sunrpc/auth_gss.h | |||
@@ -82,8 +82,8 @@ struct gss_cred { | |||
82 | enum rpc_gss_svc gc_service; | 82 | enum rpc_gss_svc gc_service; |
83 | struct gss_cl_ctx __rcu *gc_ctx; | 83 | struct gss_cl_ctx __rcu *gc_ctx; |
84 | struct gss_upcall_msg *gc_upcall; | 84 | struct gss_upcall_msg *gc_upcall; |
85 | const char *gc_principal; | ||
85 | unsigned long gc_upcall_timestamp; | 86 | unsigned long gc_upcall_timestamp; |
86 | unsigned char gc_machine_cred : 1; | ||
87 | }; | 87 | }; |
88 | 88 | ||
89 | #endif /* __KERNEL__ */ | 89 | #endif /* __KERNEL__ */ |
diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c index e010a015d996..1426ec3d0a53 100644 --- a/net/sunrpc/auth_generic.c +++ b/net/sunrpc/auth_generic.c | |||
@@ -41,15 +41,17 @@ EXPORT_SYMBOL_GPL(rpc_lookup_cred); | |||
41 | /* | 41 | /* |
42 | * Public call interface for looking up machine creds. | 42 | * Public call interface for looking up machine creds. |
43 | */ | 43 | */ |
44 | struct rpc_cred *rpc_lookup_machine_cred(void) | 44 | struct rpc_cred *rpc_lookup_machine_cred(const char *service_name) |
45 | { | 45 | { |
46 | struct auth_cred acred = { | 46 | struct auth_cred acred = { |
47 | .uid = RPC_MACHINE_CRED_USERID, | 47 | .uid = RPC_MACHINE_CRED_USERID, |
48 | .gid = RPC_MACHINE_CRED_GROUPID, | 48 | .gid = RPC_MACHINE_CRED_GROUPID, |
49 | .principal = service_name, | ||
49 | .machine_cred = 1, | 50 | .machine_cred = 1, |
50 | }; | 51 | }; |
51 | 52 | ||
52 | dprintk("RPC: looking up machine cred\n"); | 53 | dprintk("RPC: looking up machine cred for service %s\n", |
54 | service_name); | ||
53 | return generic_auth.au_ops->lookup_cred(&generic_auth, &acred, 0); | 55 | return generic_auth.au_ops->lookup_cred(&generic_auth, &acred, 0); |
54 | } | 56 | } |
55 | EXPORT_SYMBOL_GPL(rpc_lookup_machine_cred); | 57 | EXPORT_SYMBOL_GPL(rpc_lookup_machine_cred); |
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index afb56553dfe7..28d72d298735 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c | |||
@@ -392,7 +392,8 @@ static void gss_encode_v0_msg(struct gss_upcall_msg *gss_msg) | |||
392 | } | 392 | } |
393 | 393 | ||
394 | static void gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, | 394 | static void gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, |
395 | struct rpc_clnt *clnt, int machine_cred) | 395 | struct rpc_clnt *clnt, |
396 | const char *service_name) | ||
396 | { | 397 | { |
397 | struct gss_api_mech *mech = gss_msg->auth->mech; | 398 | struct gss_api_mech *mech = gss_msg->auth->mech; |
398 | char *p = gss_msg->databuf; | 399 | char *p = gss_msg->databuf; |
@@ -407,12 +408,8 @@ static void gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, | |||
407 | p += len; | 408 | p += len; |
408 | gss_msg->msg.len += len; | 409 | gss_msg->msg.len += len; |
409 | } | 410 | } |
410 | if (machine_cred) { | 411 | if (service_name != NULL) { |
411 | len = sprintf(p, "service=* "); | 412 | len = sprintf(p, "service=%s ", service_name); |
412 | p += len; | ||
413 | gss_msg->msg.len += len; | ||
414 | } else if (!strcmp(clnt->cl_program->name, "nfs4_cb")) { | ||
415 | len = sprintf(p, "service=nfs "); | ||
416 | p += len; | 413 | p += len; |
417 | gss_msg->msg.len += len; | 414 | gss_msg->msg.len += len; |
418 | } | 415 | } |
@@ -429,17 +426,18 @@ static void gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, | |||
429 | } | 426 | } |
430 | 427 | ||
431 | static void gss_encode_msg(struct gss_upcall_msg *gss_msg, | 428 | static void gss_encode_msg(struct gss_upcall_msg *gss_msg, |
432 | struct rpc_clnt *clnt, int machine_cred) | 429 | struct rpc_clnt *clnt, |
430 | const char *service_name) | ||
433 | { | 431 | { |
434 | if (pipe_version == 0) | 432 | if (pipe_version == 0) |
435 | gss_encode_v0_msg(gss_msg); | 433 | gss_encode_v0_msg(gss_msg); |
436 | else /* pipe_version == 1 */ | 434 | else /* pipe_version == 1 */ |
437 | gss_encode_v1_msg(gss_msg, clnt, machine_cred); | 435 | gss_encode_v1_msg(gss_msg, clnt, service_name); |
438 | } | 436 | } |
439 | 437 | ||
440 | static inline struct gss_upcall_msg * | 438 | static struct gss_upcall_msg * |
441 | gss_alloc_msg(struct gss_auth *gss_auth, uid_t uid, struct rpc_clnt *clnt, | 439 | gss_alloc_msg(struct gss_auth *gss_auth, struct rpc_clnt *clnt, |
442 | int machine_cred) | 440 | uid_t uid, const char *service_name) |
443 | { | 441 | { |
444 | struct gss_upcall_msg *gss_msg; | 442 | struct gss_upcall_msg *gss_msg; |
445 | int vers; | 443 | int vers; |
@@ -459,7 +457,7 @@ gss_alloc_msg(struct gss_auth *gss_auth, uid_t uid, struct rpc_clnt *clnt, | |||
459 | atomic_set(&gss_msg->count, 1); | 457 | atomic_set(&gss_msg->count, 1); |
460 | gss_msg->uid = uid; | 458 | gss_msg->uid = uid; |
461 | gss_msg->auth = gss_auth; | 459 | gss_msg->auth = gss_auth; |
462 | gss_encode_msg(gss_msg, clnt, machine_cred); | 460 | gss_encode_msg(gss_msg, clnt, service_name); |
463 | return gss_msg; | 461 | return gss_msg; |
464 | } | 462 | } |
465 | 463 | ||
@@ -471,7 +469,7 @@ gss_setup_upcall(struct rpc_clnt *clnt, struct gss_auth *gss_auth, struct rpc_cr | |||
471 | struct gss_upcall_msg *gss_new, *gss_msg; | 469 | struct gss_upcall_msg *gss_new, *gss_msg; |
472 | uid_t uid = cred->cr_uid; | 470 | uid_t uid = cred->cr_uid; |
473 | 471 | ||
474 | gss_new = gss_alloc_msg(gss_auth, uid, clnt, gss_cred->gc_machine_cred); | 472 | gss_new = gss_alloc_msg(gss_auth, clnt, uid, gss_cred->gc_principal); |
475 | if (IS_ERR(gss_new)) | 473 | if (IS_ERR(gss_new)) |
476 | return gss_new; | 474 | return gss_new; |
477 | gss_msg = gss_add_msg(gss_new); | 475 | gss_msg = gss_add_msg(gss_new); |
@@ -995,7 +993,9 @@ gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags) | |||
995 | */ | 993 | */ |
996 | cred->gc_base.cr_flags = 1UL << RPCAUTH_CRED_NEW; | 994 | cred->gc_base.cr_flags = 1UL << RPCAUTH_CRED_NEW; |
997 | cred->gc_service = gss_auth->service; | 995 | cred->gc_service = gss_auth->service; |
998 | cred->gc_machine_cred = acred->machine_cred; | 996 | cred->gc_principal = NULL; |
997 | if (acred->machine_cred) | ||
998 | cred->gc_principal = acred->principal; | ||
999 | kref_get(&gss_auth->kref); | 999 | kref_get(&gss_auth->kref); |
1000 | return &cred->gc_base; | 1000 | return &cred->gc_base; |
1001 | 1001 | ||
@@ -1030,7 +1030,12 @@ gss_match(struct auth_cred *acred, struct rpc_cred *rc, int flags) | |||
1030 | if (!test_bit(RPCAUTH_CRED_UPTODATE, &rc->cr_flags)) | 1030 | if (!test_bit(RPCAUTH_CRED_UPTODATE, &rc->cr_flags)) |
1031 | return 0; | 1031 | return 0; |
1032 | out: | 1032 | out: |
1033 | if (acred->machine_cred != gss_cred->gc_machine_cred) | 1033 | if (acred->principal != NULL) { |
1034 | if (gss_cred->gc_principal == NULL) | ||
1035 | return 0; | ||
1036 | return strcmp(acred->principal, gss_cred->gc_principal) == 0; | ||
1037 | } | ||
1038 | if (gss_cred->gc_principal != NULL) | ||
1034 | return 0; | 1039 | return 0; |
1035 | return rc->cr_uid == acred->uid; | 1040 | return rc->cr_uid == acred->uid; |
1036 | } | 1041 | } |
@@ -1104,7 +1109,8 @@ static int gss_renew_cred(struct rpc_task *task) | |||
1104 | struct rpc_auth *auth = oldcred->cr_auth; | 1109 | struct rpc_auth *auth = oldcred->cr_auth; |
1105 | struct auth_cred acred = { | 1110 | struct auth_cred acred = { |
1106 | .uid = oldcred->cr_uid, | 1111 | .uid = oldcred->cr_uid, |
1107 | .machine_cred = gss_cred->gc_machine_cred, | 1112 | .principal = gss_cred->gc_principal, |
1113 | .machine_cred = (gss_cred->gc_principal != NULL ? 1 : 0), | ||
1108 | }; | 1114 | }; |
1109 | struct rpc_cred *new; | 1115 | struct rpc_cred *new; |
1110 | 1116 | ||