diff options
Diffstat (limited to 'net/sunrpc/auth.c')
| -rw-r--r-- | net/sunrpc/auth.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c index 9ac1b8c26c01..8d6f1a176b15 100644 --- a/net/sunrpc/auth.c +++ b/net/sunrpc/auth.c | |||
| @@ -184,7 +184,7 @@ rpcauth_gc_credcache(struct rpc_auth *auth, struct hlist_head *free) | |||
| 184 | */ | 184 | */ |
| 185 | struct rpc_cred * | 185 | struct rpc_cred * |
| 186 | rpcauth_lookup_credcache(struct rpc_auth *auth, struct auth_cred * acred, | 186 | rpcauth_lookup_credcache(struct rpc_auth *auth, struct auth_cred * acred, |
| 187 | int taskflags) | 187 | int flags) |
| 188 | { | 188 | { |
| 189 | struct rpc_cred_cache *cache = auth->au_credcache; | 189 | struct rpc_cred_cache *cache = auth->au_credcache; |
| 190 | HLIST_HEAD(free); | 190 | HLIST_HEAD(free); |
| @@ -193,7 +193,7 @@ rpcauth_lookup_credcache(struct rpc_auth *auth, struct auth_cred * acred, | |||
| 193 | *cred = NULL; | 193 | *cred = NULL; |
| 194 | int nr = 0; | 194 | int nr = 0; |
| 195 | 195 | ||
| 196 | if (!(taskflags & RPC_TASK_ROOTCREDS)) | 196 | if (!(flags & RPCAUTH_LOOKUP_ROOTCREDS)) |
| 197 | nr = acred->uid & RPC_CREDCACHE_MASK; | 197 | nr = acred->uid & RPC_CREDCACHE_MASK; |
| 198 | retry: | 198 | retry: |
| 199 | spin_lock(&rpc_credcache_lock); | 199 | spin_lock(&rpc_credcache_lock); |
| @@ -202,7 +202,7 @@ retry: | |||
| 202 | hlist_for_each_safe(pos, next, &cache->hashtable[nr]) { | 202 | hlist_for_each_safe(pos, next, &cache->hashtable[nr]) { |
| 203 | struct rpc_cred *entry; | 203 | struct rpc_cred *entry; |
| 204 | entry = hlist_entry(pos, struct rpc_cred, cr_hash); | 204 | entry = hlist_entry(pos, struct rpc_cred, cr_hash); |
| 205 | if (entry->cr_ops->crmatch(acred, entry, taskflags)) { | 205 | if (entry->cr_ops->crmatch(acred, entry, flags)) { |
| 206 | hlist_del(&entry->cr_hash); | 206 | hlist_del(&entry->cr_hash); |
| 207 | cred = entry; | 207 | cred = entry; |
| 208 | break; | 208 | break; |
| @@ -224,7 +224,7 @@ retry: | |||
| 224 | rpcauth_destroy_credlist(&free); | 224 | rpcauth_destroy_credlist(&free); |
| 225 | 225 | ||
| 226 | if (!cred) { | 226 | if (!cred) { |
| 227 | new = auth->au_ops->crcreate(auth, acred, taskflags); | 227 | new = auth->au_ops->crcreate(auth, acred, flags); |
| 228 | if (!IS_ERR(new)) { | 228 | if (!IS_ERR(new)) { |
| 229 | #ifdef RPC_DEBUG | 229 | #ifdef RPC_DEBUG |
| 230 | new->cr_magic = RPCAUTH_CRED_MAGIC; | 230 | new->cr_magic = RPCAUTH_CRED_MAGIC; |
| @@ -232,13 +232,21 @@ retry: | |||
| 232 | goto retry; | 232 | goto retry; |
| 233 | } else | 233 | } else |
| 234 | cred = new; | 234 | cred = new; |
| 235 | } else if ((cred->cr_flags & RPCAUTH_CRED_NEW) | ||
| 236 | && cred->cr_ops->cr_init != NULL | ||
| 237 | && !(flags & RPCAUTH_LOOKUP_NEW)) { | ||
| 238 | int res = cred->cr_ops->cr_init(auth, cred); | ||
| 239 | if (res < 0) { | ||
| 240 | put_rpccred(cred); | ||
| 241 | cred = ERR_PTR(res); | ||
| 242 | } | ||
| 235 | } | 243 | } |
| 236 | 244 | ||
| 237 | return (struct rpc_cred *) cred; | 245 | return (struct rpc_cred *) cred; |
| 238 | } | 246 | } |
| 239 | 247 | ||
| 240 | struct rpc_cred * | 248 | struct rpc_cred * |
| 241 | rpcauth_lookupcred(struct rpc_auth *auth, int taskflags) | 249 | rpcauth_lookupcred(struct rpc_auth *auth, int flags) |
| 242 | { | 250 | { |
| 243 | struct auth_cred acred = { | 251 | struct auth_cred acred = { |
| 244 | .uid = current->fsuid, | 252 | .uid = current->fsuid, |
| @@ -250,7 +258,7 @@ rpcauth_lookupcred(struct rpc_auth *auth, int taskflags) | |||
| 250 | dprintk("RPC: looking up %s cred\n", | 258 | dprintk("RPC: looking up %s cred\n", |
| 251 | auth->au_ops->au_name); | 259 | auth->au_ops->au_name); |
| 252 | get_group_info(acred.group_info); | 260 | get_group_info(acred.group_info); |
| 253 | ret = auth->au_ops->lookup_cred(auth, &acred, taskflags); | 261 | ret = auth->au_ops->lookup_cred(auth, &acred, flags); |
| 254 | put_group_info(acred.group_info); | 262 | put_group_info(acred.group_info); |
| 255 | return ret; | 263 | return ret; |
| 256 | } | 264 | } |
| @@ -265,11 +273,14 @@ rpcauth_bindcred(struct rpc_task *task) | |||
| 265 | .group_info = current->group_info, | 273 | .group_info = current->group_info, |
| 266 | }; | 274 | }; |
| 267 | struct rpc_cred *ret; | 275 | struct rpc_cred *ret; |
| 276 | int flags = 0; | ||
| 268 | 277 | ||
| 269 | dprintk("RPC: %4d looking up %s cred\n", | 278 | dprintk("RPC: %4d looking up %s cred\n", |
| 270 | task->tk_pid, task->tk_auth->au_ops->au_name); | 279 | task->tk_pid, task->tk_auth->au_ops->au_name); |
| 271 | get_group_info(acred.group_info); | 280 | get_group_info(acred.group_info); |
| 272 | ret = auth->au_ops->lookup_cred(auth, &acred, task->tk_flags); | 281 | if (task->tk_flags & RPC_TASK_ROOTCREDS) |
| 282 | flags |= RPCAUTH_LOOKUP_ROOTCREDS; | ||
| 283 | ret = auth->au_ops->lookup_cred(auth, &acred, flags); | ||
| 273 | if (!IS_ERR(ret)) | 284 | if (!IS_ERR(ret)) |
| 274 | task->tk_msg.rpc_cred = ret; | 285 | task->tk_msg.rpc_cred = ret; |
| 275 | else | 286 | else |
