diff options
Diffstat (limited to 'net/sunrpc/auth_gss')
| -rw-r--r-- | net/sunrpc/auth_gss/auth_gss.c | 10 | ||||
| -rw-r--r-- | net/sunrpc/auth_gss/gss_krb5_mech.c | 4 | ||||
| -rw-r--r-- | net/sunrpc/auth_gss/gss_mech_switch.c | 38 | ||||
| -rw-r--r-- | net/sunrpc/auth_gss/svcauth_gss.c | 2 |
4 files changed, 47 insertions, 7 deletions
diff --git a/net/sunrpc/auth_gss/auth_gss.c b/net/sunrpc/auth_gss/auth_gss.c index 45dbf1521b9a..339ba64cce1e 100644 --- a/net/sunrpc/auth_gss/auth_gss.c +++ b/net/sunrpc/auth_gss/auth_gss.c | |||
| @@ -417,7 +417,7 @@ static void gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, | |||
| 417 | gss_msg->msg.len += len; | 417 | gss_msg->msg.len += len; |
| 418 | } | 418 | } |
| 419 | if (mech->gm_upcall_enctypes) { | 419 | if (mech->gm_upcall_enctypes) { |
| 420 | len = sprintf(p, mech->gm_upcall_enctypes); | 420 | len = sprintf(p, "enctypes=%s ", mech->gm_upcall_enctypes); |
| 421 | p += len; | 421 | p += len; |
| 422 | gss_msg->msg.len += len; | 422 | gss_msg->msg.len += len; |
| 423 | } | 423 | } |
| @@ -520,7 +520,7 @@ gss_refresh_upcall(struct rpc_task *task) | |||
| 520 | warn_gssd(); | 520 | warn_gssd(); |
| 521 | task->tk_timeout = 15*HZ; | 521 | task->tk_timeout = 15*HZ; |
| 522 | rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL); | 522 | rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL); |
| 523 | return 0; | 523 | return -EAGAIN; |
| 524 | } | 524 | } |
| 525 | if (IS_ERR(gss_msg)) { | 525 | if (IS_ERR(gss_msg)) { |
| 526 | err = PTR_ERR(gss_msg); | 526 | err = PTR_ERR(gss_msg); |
| @@ -563,10 +563,12 @@ retry: | |||
| 563 | if (PTR_ERR(gss_msg) == -EAGAIN) { | 563 | if (PTR_ERR(gss_msg) == -EAGAIN) { |
| 564 | err = wait_event_interruptible_timeout(pipe_version_waitqueue, | 564 | err = wait_event_interruptible_timeout(pipe_version_waitqueue, |
| 565 | pipe_version >= 0, 15*HZ); | 565 | pipe_version >= 0, 15*HZ); |
| 566 | if (pipe_version < 0) { | ||
| 567 | warn_gssd(); | ||
| 568 | err = -EACCES; | ||
| 569 | } | ||
| 566 | if (err) | 570 | if (err) |
| 567 | goto out; | 571 | goto out; |
| 568 | if (pipe_version < 0) | ||
| 569 | warn_gssd(); | ||
| 570 | goto retry; | 572 | goto retry; |
| 571 | } | 573 | } |
| 572 | if (IS_ERR(gss_msg)) { | 574 | if (IS_ERR(gss_msg)) { |
diff --git a/net/sunrpc/auth_gss/gss_krb5_mech.c b/net/sunrpc/auth_gss/gss_krb5_mech.c index f375decc024b..0a9a2ec2e469 100644 --- a/net/sunrpc/auth_gss/gss_krb5_mech.c +++ b/net/sunrpc/auth_gss/gss_krb5_mech.c | |||
| @@ -427,7 +427,7 @@ static int | |||
| 427 | context_derive_keys_rc4(struct krb5_ctx *ctx) | 427 | context_derive_keys_rc4(struct krb5_ctx *ctx) |
| 428 | { | 428 | { |
| 429 | struct crypto_hash *hmac; | 429 | struct crypto_hash *hmac; |
| 430 | static const char sigkeyconstant[] = "signaturekey"; | 430 | char sigkeyconstant[] = "signaturekey"; |
| 431 | int slen = strlen(sigkeyconstant) + 1; /* include null terminator */ | 431 | int slen = strlen(sigkeyconstant) + 1; /* include null terminator */ |
| 432 | struct hash_desc desc; | 432 | struct hash_desc desc; |
| 433 | struct scatterlist sg[1]; | 433 | struct scatterlist sg[1]; |
| @@ -750,7 +750,7 @@ static struct gss_api_mech gss_kerberos_mech = { | |||
| 750 | .gm_ops = &gss_kerberos_ops, | 750 | .gm_ops = &gss_kerberos_ops, |
| 751 | .gm_pf_num = ARRAY_SIZE(gss_kerberos_pfs), | 751 | .gm_pf_num = ARRAY_SIZE(gss_kerberos_pfs), |
| 752 | .gm_pfs = gss_kerberos_pfs, | 752 | .gm_pfs = gss_kerberos_pfs, |
| 753 | .gm_upcall_enctypes = "enctypes=18,17,16,23,3,1,2 ", | 753 | .gm_upcall_enctypes = "18,17,16,23,3,1,2", |
| 754 | }; | 754 | }; |
| 755 | 755 | ||
| 756 | static int __init init_kerberos_module(void) | 756 | static int __init init_kerberos_module(void) |
diff --git a/net/sunrpc/auth_gss/gss_mech_switch.c b/net/sunrpc/auth_gss/gss_mech_switch.c index 8b4061049d76..e3c36a274412 100644 --- a/net/sunrpc/auth_gss/gss_mech_switch.c +++ b/net/sunrpc/auth_gss/gss_mech_switch.c | |||
| @@ -160,6 +160,28 @@ gss_mech_get_by_name(const char *name) | |||
| 160 | 160 | ||
| 161 | EXPORT_SYMBOL_GPL(gss_mech_get_by_name); | 161 | EXPORT_SYMBOL_GPL(gss_mech_get_by_name); |
| 162 | 162 | ||
| 163 | struct gss_api_mech * | ||
| 164 | gss_mech_get_by_OID(struct xdr_netobj *obj) | ||
| 165 | { | ||
| 166 | struct gss_api_mech *pos, *gm = NULL; | ||
| 167 | |||
| 168 | spin_lock(®istered_mechs_lock); | ||
| 169 | list_for_each_entry(pos, ®istered_mechs, gm_list) { | ||
| 170 | if (obj->len == pos->gm_oid.len) { | ||
| 171 | if (0 == memcmp(obj->data, pos->gm_oid.data, obj->len)) { | ||
| 172 | if (try_module_get(pos->gm_owner)) | ||
| 173 | gm = pos; | ||
| 174 | break; | ||
| 175 | } | ||
| 176 | } | ||
| 177 | } | ||
| 178 | spin_unlock(®istered_mechs_lock); | ||
| 179 | return gm; | ||
| 180 | |||
| 181 | } | ||
| 182 | |||
| 183 | EXPORT_SYMBOL_GPL(gss_mech_get_by_OID); | ||
| 184 | |||
| 163 | static inline int | 185 | static inline int |
| 164 | mech_supports_pseudoflavor(struct gss_api_mech *gm, u32 pseudoflavor) | 186 | mech_supports_pseudoflavor(struct gss_api_mech *gm, u32 pseudoflavor) |
| 165 | { | 187 | { |
| @@ -193,6 +215,22 @@ gss_mech_get_by_pseudoflavor(u32 pseudoflavor) | |||
| 193 | 215 | ||
| 194 | EXPORT_SYMBOL_GPL(gss_mech_get_by_pseudoflavor); | 216 | EXPORT_SYMBOL_GPL(gss_mech_get_by_pseudoflavor); |
| 195 | 217 | ||
| 218 | int gss_mech_list_pseudoflavors(rpc_authflavor_t *array_ptr) | ||
| 219 | { | ||
| 220 | struct gss_api_mech *pos = NULL; | ||
| 221 | int i = 0; | ||
| 222 | |||
| 223 | spin_lock(®istered_mechs_lock); | ||
| 224 | list_for_each_entry(pos, ®istered_mechs, gm_list) { | ||
| 225 | array_ptr[i] = pos->gm_pfs->pseudoflavor; | ||
| 226 | i++; | ||
| 227 | } | ||
| 228 | spin_unlock(®istered_mechs_lock); | ||
| 229 | return i; | ||
| 230 | } | ||
| 231 | |||
| 232 | EXPORT_SYMBOL_GPL(gss_mech_list_pseudoflavors); | ||
| 233 | |||
| 196 | u32 | 234 | u32 |
| 197 | gss_svc_to_pseudoflavor(struct gss_api_mech *gm, u32 service) | 235 | gss_svc_to_pseudoflavor(struct gss_api_mech *gm, u32 service) |
| 198 | { | 236 | { |
diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c index bcdae78fdfc6..8d0f7d3c71c8 100644 --- a/net/sunrpc/auth_gss/svcauth_gss.c +++ b/net/sunrpc/auth_gss/svcauth_gss.c | |||
| @@ -1101,7 +1101,7 @@ svcauth_gss_accept(struct svc_rqst *rqstp, __be32 *authp) | |||
| 1101 | 1101 | ||
| 1102 | /* credential is: | 1102 | /* credential is: |
| 1103 | * version(==1), proc(0,1,2,3), seq, service (1,2,3), handle | 1103 | * version(==1), proc(0,1,2,3), seq, service (1,2,3), handle |
| 1104 | * at least 5 u32s, and is preceeded by length, so that makes 6. | 1104 | * at least 5 u32s, and is preceded by length, so that makes 6. |
| 1105 | */ | 1105 | */ |
| 1106 | 1106 | ||
| 1107 | if (argv->iov_len < 5 * 4) | 1107 | if (argv->iov_len < 5 * 4) |
