1 /* 2 * linux/net/sunrpc/auth_gss/auth_gss.c 3 * 4 * RPCSEC_GSS client authentication. 5 * 6 * Copyright (c) 2000 The Regents of the University of Michigan. 7 * All rights reserved. 8 * 9 * Dug Song <dugsong@monkey.org> 10 * Andy Adamson <andros@umich.edu> 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer. 18 * 2. Redistributions in binary form must reproduce the above copyright 19 * notice, this list of conditions and the following disclaimer in the 20 * documentation and/or other materials provided with the distribution. 21 * 3. Neither the name of the University nor the names of its 22 * contributors may be used to endorse or promote products derived 23 * from this software without specific prior written permission. 24 * 25 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 26 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 27 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 28 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 32 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 33 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 34 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 35 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 36 */ 37 38 39 #include <linux/module.h> 40 #include <linux/init.h> 41 #include <linux/types.h> 42 #include <linux/slab.h> 43 #include <linux/sched.h> 44 #include <linux/pagemap.h> 45 #include <linux/sunrpc/clnt.h> 46 #include <linux/sunrpc/auth.h> 47 #include <linux/sunrpc/auth_gss.h> 48 #include <linux/sunrpc/svcauth_gss.h> 49 #include <linux/sunrpc/gss_err.h> 50 #include <linux/workqueue.h> 51 #include <linux/sunrpc/rpc_pipe_fs.h> 52 #include <linux/sunrpc/gss_api.h> 53 #include <asm/uaccess.h> 54 #include <linux/hashtable.h> 55 56 #include "../netns.h" 57 58 static const struct rpc_authops authgss_ops; 59 60 static const struct rpc_credops gss_credops; 61 static const struct rpc_credops gss_nullops; 62 63 #define GSS_RETRY_EXPIRED 5 64 static unsigned int gss_expired_cred_retry_delay = GSS_RETRY_EXPIRED; 65 66 #define GSS_KEY_EXPIRE_TIMEO 240 67 static unsigned int gss_key_expire_timeo = GSS_KEY_EXPIRE_TIMEO; 68 69 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG) 70 # define RPCDBG_FACILITY RPCDBG_AUTH 71 #endif 72 73 #define GSS_CRED_SLACK (RPC_MAX_AUTH_SIZE * 2) 74 /* length of a krb5 verifier (48), plus data added before arguments when 75 * using integrity (two 4-byte integers): */ 76 #define GSS_VERF_SLACK 100 77 78 static DEFINE_HASHTABLE(gss_auth_hash_table, 4); 79 static DEFINE_SPINLOCK(gss_auth_hash_lock); 80 81 struct gss_pipe { 82 struct rpc_pipe_dir_object pdo; 83 struct rpc_pipe *pipe; 84 struct rpc_clnt *clnt; 85 const char *name; 86 struct kref kref; 87 }; 88 89 struct gss_auth { 90 struct kref kref; 91 struct hlist_node hash; 92 struct rpc_auth rpc_auth; 93 struct gss_api_mech *mech; 94 enum rpc_gss_svc service; 95 struct rpc_clnt *client; 96 struct net *net; 97 /* 98 * There are two upcall pipes; dentry[1], named "gssd", is used 99 * for the new text-based upcall; dentry[0] is named after the 100 * mechanism (for example, "krb5") and exists for 101 * backwards-compatibility with older gssd's. 102 */ 103 struct gss_pipe *gss_pipe[2]; 104 const char *target_name; 105 }; 106 107 /* pipe_version >= 0 if and only if someone has a pipe open. */ 108 static DEFINE_SPINLOCK(pipe_version_lock); 109 static struct rpc_wait_queue pipe_version_rpc_waitqueue; 110 static DECLARE_WAIT_QUEUE_HEAD(pipe_version_waitqueue); 111 static void gss_put_auth(struct gss_auth *gss_auth); 112 113 static void gss_free_ctx(struct gss_cl_ctx *); 114 static const struct rpc_pipe_ops gss_upcall_ops_v0; 115 static const struct rpc_pipe_ops gss_upcall_ops_v1; 116 117 static inline struct gss_cl_ctx * 118 gss_get_ctx(struct gss_cl_ctx *ctx) 119 { 120 atomic_inc(&ctx->count); 121 return ctx; 122 } 123 124 static inline void 125 gss_put_ctx(struct gss_cl_ctx *ctx) 126 { 127 if (atomic_dec_and_test(&ctx->count)) 128 gss_free_ctx(ctx); 129 } 130 131 /* gss_cred_set_ctx: 132 * called by gss_upcall_callback and gss_create_upcall in order 133 * to set the gss context. The actual exchange of an old context 134 * and a new one is protected by the pipe->lock. 135 */ 136 static void 137 gss_cred_set_ctx(struct rpc_cred *cred, struct gss_cl_ctx *ctx) 138 { 139 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base); 140 141 if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags)) 142 return; 143 gss_get_ctx(ctx); 144 rcu_assign_pointer(gss_cred->gc_ctx, ctx); 145 set_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 146 smp_mb__before_atomic(); 147 clear_bit(RPCAUTH_CRED_NEW, &cred->cr_flags); 148 } 149 150 static const void * 151 simple_get_bytes(const void *p, const void *end, void *res, size_t len) 152 { 153 const void *q = (const void *)((const char *)p + len); 154 if (unlikely(q > end || q < p)) 155 return ERR_PTR(-EFAULT); 156 memcpy(res, p, len); 157 return q; 158 } 159 160 static inline const void * 161 simple_get_netobj(const void *p, const void *end, struct xdr_netobj *dest) 162 { 163 const void *q; 164 unsigned int len; 165 166 p = simple_get_bytes(p, end, &len, sizeof(len)); 167 if (IS_ERR(p)) 168 return p; 169 q = (const void *)((const char *)p + len); 170 if (unlikely(q > end || q < p)) 171 return ERR_PTR(-EFAULT); 172 dest->data = kmemdup(p, len, GFP_NOFS); 173 if (unlikely(dest->data == NULL)) 174 return ERR_PTR(-ENOMEM); 175 dest->len = len; 176 return q; 177 } 178 179 static struct gss_cl_ctx * 180 gss_cred_get_ctx(struct rpc_cred *cred) 181 { 182 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base); 183 struct gss_cl_ctx *ctx = NULL; 184 185 rcu_read_lock(); 186 ctx = rcu_dereference(gss_cred->gc_ctx); 187 if (ctx) 188 gss_get_ctx(ctx); 189 rcu_read_unlock(); 190 return ctx; 191 } 192 193 static struct gss_cl_ctx * 194 gss_alloc_context(void) 195 { 196 struct gss_cl_ctx *ctx; 197 198 ctx = kzalloc(sizeof(*ctx), GFP_NOFS); 199 if (ctx != NULL) { 200 ctx->gc_proc = RPC_GSS_PROC_DATA; 201 ctx->gc_seq = 1; /* NetApp 6.4R1 doesn't accept seq. no. 0 */ 202 spin_lock_init(&ctx->gc_seq_lock); 203 atomic_set(&ctx->count,1); 204 } 205 return ctx; 206 } 207 208 #define GSSD_MIN_TIMEOUT (60 * 60) 209 static const void * 210 gss_fill_context(const void *p, const void *end, struct gss_cl_ctx *ctx, struct gss_api_mech *gm) 211 { 212 const void *q; 213 unsigned int seclen; 214 unsigned int timeout; 215 unsigned long now = jiffies; 216 u32 window_size; 217 int ret; 218 219 /* First unsigned int gives the remaining lifetime in seconds of the 220 * credential - e.g. the remaining TGT lifetime for Kerberos or 221 * the -t value passed to GSSD. 222 */ 223 p = simple_get_bytes(p, end, &timeout, sizeof(timeout)); 224 if (IS_ERR(p)) 225 goto err; 226 if (timeout == 0) 227 timeout = GSSD_MIN_TIMEOUT; 228 ctx->gc_expiry = now + ((unsigned long)timeout * HZ); 229 /* Sequence number window. Determines the maximum number of 230 * simultaneous requests 231 */ 232 p = simple_get_bytes(p, end, &window_size, sizeof(window_size)); 233 if (IS_ERR(p)) 234 goto err; 235 ctx->gc_win = window_size; 236 /* gssd signals an error by passing ctx->gc_win = 0: */ 237 if (ctx->gc_win == 0) { 238 /* 239 * in which case, p points to an error code. Anything other 240 * than -EKEYEXPIRED gets converted to -EACCES. 241 */ 242 p = simple_get_bytes(p, end, &ret, sizeof(ret)); 243 if (!IS_ERR(p)) 244 p = (ret == -EKEYEXPIRED) ? ERR_PTR(-EKEYEXPIRED) : 245 ERR_PTR(-EACCES); 246 goto err; 247 } 248 /* copy the opaque wire context */ 249 p = simple_get_netobj(p, end, &ctx->gc_wire_ctx); 250 if (IS_ERR(p)) 251 goto err; 252 /* import the opaque security context */ 253 p = simple_get_bytes(p, end, &seclen, sizeof(seclen)); 254 if (IS_ERR(p)) 255 goto err; 256 q = (const void *)((const char *)p + seclen); 257 if (unlikely(q > end || q < p)) { 258 p = ERR_PTR(-EFAULT); 259 goto err; 260 } 261 ret = gss_import_sec_context(p, seclen, gm, &ctx->gc_gss_ctx, NULL, GFP_NOFS); 262 if (ret < 0) { 263 p = ERR_PTR(ret); 264 goto err; 265 } 266 267 /* is there any trailing data? */ 268 if (q == end) { 269 p = q; 270 goto done; 271 } 272 273 /* pull in acceptor name (if there is one) */ 274 p = simple_get_netobj(q, end, &ctx->gc_acceptor); 275 if (IS_ERR(p)) 276 goto err; 277 done: 278 dprintk("RPC: %s Success. gc_expiry %lu now %lu timeout %u acceptor %.*s\n", 279 __func__, ctx->gc_expiry, now, timeout, ctx->gc_acceptor.len, 280 ctx->gc_acceptor.data); 281 return p; 282 err: 283 dprintk("RPC: %s returns error %ld\n", __func__, -PTR_ERR(p)); 284 return p; 285 } 286 287 #define UPCALL_BUF_LEN 128 288 289 struct gss_upcall_msg { 290 atomic_t count; 291 kuid_t uid; 292 struct rpc_pipe_msg msg; 293 struct list_head list; 294 struct gss_auth *auth; 295 struct rpc_pipe *pipe; 296 struct rpc_wait_queue rpc_waitqueue; 297 wait_queue_head_t waitqueue; 298 struct gss_cl_ctx *ctx; 299 char databuf[UPCALL_BUF_LEN]; 300 }; 301 302 static int get_pipe_version(struct net *net) 303 { 304 struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 305 int ret; 306 307 spin_lock(&pipe_version_lock); 308 if (sn->pipe_version >= 0) { 309 atomic_inc(&sn->pipe_users); 310 ret = sn->pipe_version; 311 } else 312 ret = -EAGAIN; 313 spin_unlock(&pipe_version_lock); 314 return ret; 315 } 316 317 static void put_pipe_version(struct net *net) 318 { 319 struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 320 321 if (atomic_dec_and_lock(&sn->pipe_users, &pipe_version_lock)) { 322 sn->pipe_version = -1; 323 spin_unlock(&pipe_version_lock); 324 } 325 } 326 327 static void 328 gss_release_msg(struct gss_upcall_msg *gss_msg) 329 { 330 struct net *net = gss_msg->auth->net; 331 if (!atomic_dec_and_test(&gss_msg->count)) 332 return; 333 put_pipe_version(net); 334 BUG_ON(!list_empty(&gss_msg->list)); 335 if (gss_msg->ctx != NULL) 336 gss_put_ctx(gss_msg->ctx); 337 rpc_destroy_wait_queue(&gss_msg->rpc_waitqueue); 338 gss_put_auth(gss_msg->auth); 339 kfree(gss_msg); 340 } 341 342 static struct gss_upcall_msg * 343 __gss_find_upcall(struct rpc_pipe *pipe, kuid_t uid) 344 { 345 struct gss_upcall_msg *pos; 346 list_for_each_entry(pos, &pipe->in_downcall, list) { 347 if (!uid_eq(pos->uid, uid)) 348 continue; 349 atomic_inc(&pos->count); 350 dprintk("RPC: %s found msg %p\n", __func__, pos); 351 return pos; 352 } 353 dprintk("RPC: %s found nothing\n", __func__); 354 return NULL; 355 } 356 357 /* Try to add an upcall to the pipefs queue. 358 * If an upcall owned by our uid already exists, then we return a reference 359 * to that upcall instead of adding the new upcall. 360 */ 361 static inline struct gss_upcall_msg * 362 gss_add_msg(struct gss_upcall_msg *gss_msg) 363 { 364 struct rpc_pipe *pipe = gss_msg->pipe; 365 struct gss_upcall_msg *old; 366 367 spin_lock(&pipe->lock); 368 old = __gss_find_upcall(pipe, gss_msg->uid); 369 if (old == NULL) { 370 atomic_inc(&gss_msg->count); 371 list_add(&gss_msg->list, &pipe->in_downcall); 372 } else 373 gss_msg = old; 374 spin_unlock(&pipe->lock); 375 return gss_msg; 376 } 377 378 static void 379 __gss_unhash_msg(struct gss_upcall_msg *gss_msg) 380 { 381 list_del_init(&gss_msg->list); 382 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); 383 wake_up_all(&gss_msg->waitqueue); 384 atomic_dec(&gss_msg->count); 385 } 386 387 static void 388 gss_unhash_msg(struct gss_upcall_msg *gss_msg) 389 { 390 struct rpc_pipe *pipe = gss_msg->pipe; 391 392 if (list_empty(&gss_msg->list)) 393 return; 394 spin_lock(&pipe->lock); 395 if (!list_empty(&gss_msg->list)) 396 __gss_unhash_msg(gss_msg); 397 spin_unlock(&pipe->lock); 398 } 399 400 static void 401 gss_handle_downcall_result(struct gss_cred *gss_cred, struct gss_upcall_msg *gss_msg) 402 { 403 switch (gss_msg->msg.errno) { 404 case 0: 405 if (gss_msg->ctx == NULL) 406 break; 407 clear_bit(RPCAUTH_CRED_NEGATIVE, &gss_cred->gc_base.cr_flags); 408 gss_cred_set_ctx(&gss_cred->gc_base, gss_msg->ctx); 409 break; 410 case -EKEYEXPIRED: 411 set_bit(RPCAUTH_CRED_NEGATIVE, &gss_cred->gc_base.cr_flags); 412 } 413 gss_cred->gc_upcall_timestamp = jiffies; 414 gss_cred->gc_upcall = NULL; 415 rpc_wake_up_status(&gss_msg->rpc_waitqueue, gss_msg->msg.errno); 416 } 417 418 static void 419 gss_upcall_callback(struct rpc_task *task) 420 { 421 struct gss_cred *gss_cred = container_of(task->tk_rqstp->rq_cred, 422 struct gss_cred, gc_base); 423 struct gss_upcall_msg *gss_msg = gss_cred->gc_upcall; 424 struct rpc_pipe *pipe = gss_msg->pipe; 425 426 spin_lock(&pipe->lock); 427 gss_handle_downcall_result(gss_cred, gss_msg); 428 spin_unlock(&pipe->lock); 429 task->tk_status = gss_msg->msg.errno; 430 gss_release_msg(gss_msg); 431 } 432 433 static void gss_encode_v0_msg(struct gss_upcall_msg *gss_msg) 434 { 435 uid_t uid = from_kuid(&init_user_ns, gss_msg->uid); 436 memcpy(gss_msg->databuf, &uid, sizeof(uid)); 437 gss_msg->msg.data = gss_msg->databuf; 438 gss_msg->msg.len = sizeof(uid); 439 440 BUILD_BUG_ON(sizeof(uid) > sizeof(gss_msg->databuf)); 441 } 442 443 static int gss_encode_v1_msg(struct gss_upcall_msg *gss_msg, 444 const char *service_name, 445 const char *target_name) 446 { 447 struct gss_api_mech *mech = gss_msg->auth->mech; 448 char *p = gss_msg->databuf; 449 size_t buflen = sizeof(gss_msg->databuf); 450 int len; 451 452 len = scnprintf(p, buflen, "mech=%s uid=%d ", mech->gm_name, 453 from_kuid(&init_user_ns, gss_msg->uid)); 454 buflen -= len; 455 p += len; 456 gss_msg->msg.len = len; 457 if (target_name) { 458 len = scnprintf(p, buflen, "target=%s ", target_name); 459 buflen -= len; 460 p += len; 461 gss_msg->msg.len += len; 462 } 463 if (service_name != NULL) { 464 len = scnprintf(p, buflen, "service=%s ", service_name); 465 buflen -= len; 466 p += len; 467 gss_msg->msg.len += len; 468 } 469 if (mech->gm_upcall_enctypes) { 470 len = scnprintf(p, buflen, "enctypes=%s ", 471 mech->gm_upcall_enctypes); 472 buflen -= len; 473 p += len; 474 gss_msg->msg.len += len; 475 } 476 len = scnprintf(p, buflen, "\n"); 477 if (len == 0) 478 goto out_overflow; 479 gss_msg->msg.len += len; 480 481 gss_msg->msg.data = gss_msg->databuf; 482 return 0; 483 out_overflow: 484 WARN_ON_ONCE(1); 485 return -ENOMEM; 486 } 487 488 static struct gss_upcall_msg * 489 gss_alloc_msg(struct gss_auth *gss_auth, 490 kuid_t uid, const char *service_name) 491 { 492 struct gss_upcall_msg *gss_msg; 493 int vers; 494 int err = -ENOMEM; 495 496 gss_msg = kzalloc(sizeof(*gss_msg), GFP_NOFS); 497 if (gss_msg == NULL) 498 goto err; 499 vers = get_pipe_version(gss_auth->net); 500 err = vers; 501 if (err < 0) 502 goto err_free_msg; 503 gss_msg->pipe = gss_auth->gss_pipe[vers]->pipe; 504 INIT_LIST_HEAD(&gss_msg->list); 505 rpc_init_wait_queue(&gss_msg->rpc_waitqueue, "RPCSEC_GSS upcall waitq"); 506 init_waitqueue_head(&gss_msg->waitqueue); 507 atomic_set(&gss_msg->count, 1); 508 gss_msg->uid = uid; 509 gss_msg->auth = gss_auth; 510 switch (vers) { 511 case 0: 512 gss_encode_v0_msg(gss_msg); 513 break; 514 default: 515 err = gss_encode_v1_msg(gss_msg, service_name, gss_auth->target_name); 516 if (err) 517 goto err_put_pipe_version; 518 }; 519 kref_get(&gss_auth->kref); 520 return gss_msg; 521 err_put_pipe_version: 522 put_pipe_version(gss_auth->net); 523 err_free_msg: 524 kfree(gss_msg); 525 err: 526 return ERR_PTR(err); 527 } 528 529 static struct gss_upcall_msg * 530 gss_setup_upcall(struct gss_auth *gss_auth, struct rpc_cred *cred) 531 { 532 struct gss_cred *gss_cred = container_of(cred, 533 struct gss_cred, gc_base); 534 struct gss_upcall_msg *gss_new, *gss_msg; 535 kuid_t uid = cred->cr_uid; 536 537 gss_new = gss_alloc_msg(gss_auth, uid, gss_cred->gc_principal); 538 if (IS_ERR(gss_new)) 539 return gss_new; 540 gss_msg = gss_add_msg(gss_new); 541 if (gss_msg == gss_new) { 542 int res = rpc_queue_upcall(gss_new->pipe, &gss_new->msg); 543 if (res) { 544 gss_unhash_msg(gss_new); 545 gss_msg = ERR_PTR(res); 546 } 547 } else 548 gss_release_msg(gss_new); 549 return gss_msg; 550 } 551 552 static void warn_gssd(void) 553 { 554 dprintk("AUTH_GSS upcall failed. Please check user daemon is running.\n"); 555 } 556 557 static inline int 558 gss_refresh_upcall(struct rpc_task *task) 559 { 560 struct rpc_cred *cred = task->tk_rqstp->rq_cred; 561 struct gss_auth *gss_auth = container_of(cred->cr_auth, 562 struct gss_auth, rpc_auth); 563 struct gss_cred *gss_cred = container_of(cred, 564 struct gss_cred, gc_base); 565 struct gss_upcall_msg *gss_msg; 566 struct rpc_pipe *pipe; 567 int err = 0; 568 569 dprintk("RPC: %5u %s for uid %u\n", 570 task->tk_pid, __func__, from_kuid(&init_user_ns, cred->cr_uid)); 571 gss_msg = gss_setup_upcall(gss_auth, cred); 572 if (PTR_ERR(gss_msg) == -EAGAIN) { 573 /* XXX: warning on the first, under the assumption we 574 * shouldn't normally hit this case on a refresh. */ 575 warn_gssd(); 576 task->tk_timeout = 15*HZ; 577 rpc_sleep_on(&pipe_version_rpc_waitqueue, task, NULL); 578 return -EAGAIN; 579 } 580 if (IS_ERR(gss_msg)) { 581 err = PTR_ERR(gss_msg); 582 goto out; 583 } 584 pipe = gss_msg->pipe; 585 spin_lock(&pipe->lock); 586 if (gss_cred->gc_upcall != NULL) 587 rpc_sleep_on(&gss_cred->gc_upcall->rpc_waitqueue, task, NULL); 588 else if (gss_msg->ctx == NULL && gss_msg->msg.errno >= 0) { 589 task->tk_timeout = 0; 590 gss_cred->gc_upcall = gss_msg; 591 /* gss_upcall_callback will release the reference to gss_upcall_msg */ 592 atomic_inc(&gss_msg->count); 593 rpc_sleep_on(&gss_msg->rpc_waitqueue, task, gss_upcall_callback); 594 } else { 595 gss_handle_downcall_result(gss_cred, gss_msg); 596 err = gss_msg->msg.errno; 597 } 598 spin_unlock(&pipe->lock); 599 gss_release_msg(gss_msg); 600 out: 601 dprintk("RPC: %5u %s for uid %u result %d\n", 602 task->tk_pid, __func__, 603 from_kuid(&init_user_ns, cred->cr_uid), err); 604 return err; 605 } 606 607 static inline int 608 gss_create_upcall(struct gss_auth *gss_auth, struct gss_cred *gss_cred) 609 { 610 struct net *net = gss_auth->net; 611 struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 612 struct rpc_pipe *pipe; 613 struct rpc_cred *cred = &gss_cred->gc_base; 614 struct gss_upcall_msg *gss_msg; 615 DEFINE_WAIT(wait); 616 int err; 617 618 dprintk("RPC: %s for uid %u\n", 619 __func__, from_kuid(&init_user_ns, cred->cr_uid)); 620 retry: 621 err = 0; 622 /* if gssd is down, just skip upcalling altogether */ 623 if (!gssd_running(net)) { 624 warn_gssd(); 625 return -EACCES; 626 } 627 gss_msg = gss_setup_upcall(gss_auth, cred); 628 if (PTR_ERR(gss_msg) == -EAGAIN) { 629 err = wait_event_interruptible_timeout(pipe_version_waitqueue, 630 sn->pipe_version >= 0, 15 * HZ); 631 if (sn->pipe_version < 0) { 632 warn_gssd(); 633 err = -EACCES; 634 } 635 if (err < 0) 636 goto out; 637 goto retry; 638 } 639 if (IS_ERR(gss_msg)) { 640 err = PTR_ERR(gss_msg); 641 goto out; 642 } 643 pipe = gss_msg->pipe; 644 for (;;) { 645 prepare_to_wait(&gss_msg->waitqueue, &wait, TASK_KILLABLE); 646 spin_lock(&pipe->lock); 647 if (gss_msg->ctx != NULL || gss_msg->msg.errno < 0) { 648 break; 649 } 650 spin_unlock(&pipe->lock); 651 if (fatal_signal_pending(current)) { 652 err = -ERESTARTSYS; 653 goto out_intr; 654 } 655 schedule(); 656 } 657 if (gss_msg->ctx) 658 gss_cred_set_ctx(cred, gss_msg->ctx); 659 else 660 err = gss_msg->msg.errno; 661 spin_unlock(&pipe->lock); 662 out_intr: 663 finish_wait(&gss_msg->waitqueue, &wait); 664 gss_release_msg(gss_msg); 665 out: 666 dprintk("RPC: %s for uid %u result %d\n", 667 __func__, from_kuid(&init_user_ns, cred->cr_uid), err); 668 return err; 669 } 670 671 #define MSG_BUF_MAXSIZE 1024 672 673 static ssize_t 674 gss_pipe_downcall(struct file *filp, const char __user *src, size_t mlen) 675 { 676 const void *p, *end; 677 void *buf; 678 struct gss_upcall_msg *gss_msg; 679 struct rpc_pipe *pipe = RPC_I(file_inode(filp))->pipe; 680 struct gss_cl_ctx *ctx; 681 uid_t id; 682 kuid_t uid; 683 ssize_t err = -EFBIG; 684 685 if (mlen > MSG_BUF_MAXSIZE) 686 goto out; 687 err = -ENOMEM; 688 buf = kmalloc(mlen, GFP_NOFS); 689 if (!buf) 690 goto out; 691 692 err = -EFAULT; 693 if (copy_from_user(buf, src, mlen)) 694 goto err; 695 696 end = (const void *)((char *)buf + mlen); 697 p = simple_get_bytes(buf, end, &id, sizeof(id)); 698 if (IS_ERR(p)) { 699 err = PTR_ERR(p); 700 goto err; 701 } 702 703 uid = make_kuid(&init_user_ns, id); 704 if (!uid_valid(uid)) { 705 err = -EINVAL; 706 goto err; 707 } 708 709 err = -ENOMEM; 710 ctx = gss_alloc_context(); 711 if (ctx == NULL) 712 goto err; 713 714 err = -ENOENT; 715 /* Find a matching upcall */ 716 spin_lock(&pipe->lock); 717 gss_msg = __gss_find_upcall(pipe, uid); 718 if (gss_msg == NULL) { 719 spin_unlock(&pipe->lock); 720 goto err_put_ctx; 721 } 722 list_del_init(&gss_msg->list); 723 spin_unlock(&pipe->lock); 724 725 p = gss_fill_context(p, end, ctx, gss_msg->auth->mech); 726 if (IS_ERR(p)) { 727 err = PTR_ERR(p); 728 switch (err) { 729 case -EACCES: 730 case -EKEYEXPIRED: 731 gss_msg->msg.errno = err; 732 err = mlen; 733 break; 734 case -EFAULT: 735 case -ENOMEM: 736 case -EINVAL: 737 case -ENOSYS: 738 gss_msg->msg.errno = -EAGAIN; 739 break; 740 default: 741 printk(KERN_CRIT "%s: bad return from " 742 "gss_fill_context: %zd\n", __func__, err); 743 gss_msg->msg.errno = -EIO; 744 } 745 goto err_release_msg; 746 } 747 gss_msg->ctx = gss_get_ctx(ctx); 748 err = mlen; 749 750 err_release_msg: 751 spin_lock(&pipe->lock); 752 __gss_unhash_msg(gss_msg); 753 spin_unlock(&pipe->lock); 754 gss_release_msg(gss_msg); 755 err_put_ctx: 756 gss_put_ctx(ctx); 757 err: 758 kfree(buf); 759 out: 760 dprintk("RPC: %s returning %Zd\n", __func__, err); 761 return err; 762 } 763 764 static int gss_pipe_open(struct inode *inode, int new_version) 765 { 766 struct net *net = inode->i_sb->s_fs_info; 767 struct sunrpc_net *sn = net_generic(net, sunrpc_net_id); 768 int ret = 0; 769 770 spin_lock(&pipe_version_lock); 771 if (sn->pipe_version < 0) { 772 /* First open of any gss pipe determines the version: */ 773 sn->pipe_version = new_version; 774 rpc_wake_up(&pipe_version_rpc_waitqueue); 775 wake_up(&pipe_version_waitqueue); 776 } else if (sn->pipe_version != new_version) { 777 /* Trying to open a pipe of a different version */ 778 ret = -EBUSY; 779 goto out; 780 } 781 atomic_inc(&sn->pipe_users); 782 out: 783 spin_unlock(&pipe_version_lock); 784 return ret; 785 786 } 787 788 static int gss_pipe_open_v0(struct inode *inode) 789 { 790 return gss_pipe_open(inode, 0); 791 } 792 793 static int gss_pipe_open_v1(struct inode *inode) 794 { 795 return gss_pipe_open(inode, 1); 796 } 797 798 static void 799 gss_pipe_release(struct inode *inode) 800 { 801 struct net *net = inode->i_sb->s_fs_info; 802 struct rpc_pipe *pipe = RPC_I(inode)->pipe; 803 struct gss_upcall_msg *gss_msg; 804 805 restart: 806 spin_lock(&pipe->lock); 807 list_for_each_entry(gss_msg, &pipe->in_downcall, list) { 808 809 if (!list_empty(&gss_msg->msg.list)) 810 continue; 811 gss_msg->msg.errno = -EPIPE; 812 atomic_inc(&gss_msg->count); 813 __gss_unhash_msg(gss_msg); 814 spin_unlock(&pipe->lock); 815 gss_release_msg(gss_msg); 816 goto restart; 817 } 818 spin_unlock(&pipe->lock); 819 820 put_pipe_version(net); 821 } 822 823 static void 824 gss_pipe_destroy_msg(struct rpc_pipe_msg *msg) 825 { 826 struct gss_upcall_msg *gss_msg = container_of(msg, struct gss_upcall_msg, msg); 827 828 if (msg->errno < 0) { 829 dprintk("RPC: %s releasing msg %p\n", 830 __func__, gss_msg); 831 atomic_inc(&gss_msg->count); 832 gss_unhash_msg(gss_msg); 833 if (msg->errno == -ETIMEDOUT) 834 warn_gssd(); 835 gss_release_msg(gss_msg); 836 } 837 } 838 839 static void gss_pipe_dentry_destroy(struct dentry *dir, 840 struct rpc_pipe_dir_object *pdo) 841 { 842 struct gss_pipe *gss_pipe = pdo->pdo_data; 843 struct rpc_pipe *pipe = gss_pipe->pipe; 844 845 if (pipe->dentry != NULL) { 846 rpc_unlink(pipe->dentry); 847 pipe->dentry = NULL; 848 } 849 } 850 851 static int gss_pipe_dentry_create(struct dentry *dir, 852 struct rpc_pipe_dir_object *pdo) 853 { 854 struct gss_pipe *p = pdo->pdo_data; 855 struct dentry *dentry; 856 857 dentry = rpc_mkpipe_dentry(dir, p->name, p->clnt, p->pipe); 858 if (IS_ERR(dentry)) 859 return PTR_ERR(dentry); 860 p->pipe->dentry = dentry; 861 return 0; 862 } 863 864 static const struct rpc_pipe_dir_object_ops gss_pipe_dir_object_ops = { 865 .create = gss_pipe_dentry_create, 866 .destroy = gss_pipe_dentry_destroy, 867 }; 868 869 static struct gss_pipe *gss_pipe_alloc(struct rpc_clnt *clnt, 870 const char *name, 871 const struct rpc_pipe_ops *upcall_ops) 872 { 873 struct gss_pipe *p; 874 int err = -ENOMEM; 875 876 p = kmalloc(sizeof(*p), GFP_KERNEL); 877 if (p == NULL) 878 goto err; 879 p->pipe = rpc_mkpipe_data(upcall_ops, RPC_PIPE_WAIT_FOR_OPEN); 880 if (IS_ERR(p->pipe)) { 881 err = PTR_ERR(p->pipe); 882 goto err_free_gss_pipe; 883 } 884 p->name = name; 885 p->clnt = clnt; 886 kref_init(&p->kref); 887 rpc_init_pipe_dir_object(&p->pdo, 888 &gss_pipe_dir_object_ops, 889 p); 890 return p; 891 err_free_gss_pipe: 892 kfree(p); 893 err: 894 return ERR_PTR(err); 895 } 896 897 struct gss_alloc_pdo { 898 struct rpc_clnt *clnt; 899 const char *name; 900 const struct rpc_pipe_ops *upcall_ops; 901 }; 902 903 static int gss_pipe_match_pdo(struct rpc_pipe_dir_object *pdo, void *data) 904 { 905 struct gss_pipe *gss_pipe; 906 struct gss_alloc_pdo *args = data; 907 908 if (pdo->pdo_ops != &gss_pipe_dir_object_ops) 909 return 0; 910 gss_pipe = container_of(pdo, struct gss_pipe, pdo); 911 if (strcmp(gss_pipe->name, args->name) != 0) 912 return 0; 913 if (!kref_get_unless_zero(&gss_pipe->kref)) 914 return 0; 915 return 1; 916 } 917 918 static struct rpc_pipe_dir_object *gss_pipe_alloc_pdo(void *data) 919 { 920 struct gss_pipe *gss_pipe; 921 struct gss_alloc_pdo *args = data; 922 923 gss_pipe = gss_pipe_alloc(args->clnt, args->name, args->upcall_ops); 924 if (!IS_ERR(gss_pipe)) 925 return &gss_pipe->pdo; 926 return NULL; 927 } 928 929 static struct gss_pipe *gss_pipe_get(struct rpc_clnt *clnt, 930 const char *name, 931 const struct rpc_pipe_ops *upcall_ops) 932 { 933 struct net *net = rpc_net_ns(clnt); 934 struct rpc_pipe_dir_object *pdo; 935 struct gss_alloc_pdo args = { 936 .clnt = clnt, 937 .name = name, 938 .upcall_ops = upcall_ops, 939 }; 940 941 pdo = rpc_find_or_alloc_pipe_dir_object(net, 942 &clnt->cl_pipedir_objects, 943 gss_pipe_match_pdo, 944 gss_pipe_alloc_pdo, 945 &args); 946 if (pdo != NULL) 947 return container_of(pdo, struct gss_pipe, pdo); 948 return ERR_PTR(-ENOMEM); 949 } 950 951 static void __gss_pipe_free(struct gss_pipe *p) 952 { 953 struct rpc_clnt *clnt = p->clnt; 954 struct net *net = rpc_net_ns(clnt); 955 956 rpc_remove_pipe_dir_object(net, 957 &clnt->cl_pipedir_objects, 958 &p->pdo); 959 rpc_destroy_pipe_data(p->pipe); 960 kfree(p); 961 } 962 963 static void __gss_pipe_release(struct kref *kref) 964 { 965 struct gss_pipe *p = container_of(kref, struct gss_pipe, kref); 966 967 __gss_pipe_free(p); 968 } 969 970 static void gss_pipe_free(struct gss_pipe *p) 971 { 972 if (p != NULL) 973 kref_put(&p->kref, __gss_pipe_release); 974 } 975 976 /* 977 * NOTE: we have the opportunity to use different 978 * parameters based on the input flavor (which must be a pseudoflavor) 979 */ 980 static struct gss_auth * 981 gss_create_new(struct rpc_auth_create_args *args, struct rpc_clnt *clnt) 982 { 983 rpc_authflavor_t flavor = args->pseudoflavor; 984 struct gss_auth *gss_auth; 985 struct gss_pipe *gss_pipe; 986 struct rpc_auth * auth; 987 int err = -ENOMEM; /* XXX? */ 988 989 dprintk("RPC: creating GSS authenticator for client %p\n", clnt); 990 991 if (!try_module_get(THIS_MODULE)) 992 return ERR_PTR(err); 993 if (!(gss_auth = kmalloc(sizeof(*gss_auth), GFP_KERNEL))) 994 goto out_dec; 995 INIT_HLIST_NODE(&gss_auth->hash); 996 gss_auth->target_name = NULL; 997 if (args->target_name) { 998 gss_auth->target_name = kstrdup(args->target_name, GFP_KERNEL); 999 if (gss_auth->target_name == NULL) 1000 goto err_free; 1001 } 1002 gss_auth->client = clnt; 1003 gss_auth->net = get_net(rpc_net_ns(clnt)); 1004 err = -EINVAL; 1005 gss_auth->mech = gss_mech_get_by_pseudoflavor(flavor); 1006 if (!gss_auth->mech) { 1007 dprintk("RPC: Pseudoflavor %d not found!\n", flavor); 1008 goto err_put_net; 1009 } 1010 gss_auth->service = gss_pseudoflavor_to_service(gss_auth->mech, flavor); 1011 if (gss_auth->service == 0) 1012 goto err_put_mech; 1013 if (!gssd_running(gss_auth->net)) 1014 goto err_put_mech; 1015 auth = &gss_auth->rpc_auth; 1016 auth->au_cslack = GSS_CRED_SLACK >> 2; 1017 auth->au_rslack = GSS_VERF_SLACK >> 2; 1018 auth->au_flags = 0; 1019 auth->au_ops = &authgss_ops; 1020 auth->au_flavor = flavor; 1021 if (gss_pseudoflavor_to_datatouch(gss_auth->mech, flavor)) 1022 auth->au_flags |= RPCAUTH_AUTH_DATATOUCH; 1023 atomic_set(&auth->au_count, 1); 1024 kref_init(&gss_auth->kref); 1025 1026 err = rpcauth_init_credcache(auth); 1027 if (err) 1028 goto err_put_mech; 1029 /* 1030 * Note: if we created the old pipe first, then someone who 1031 * examined the directory at the right moment might conclude 1032 * that we supported only the old pipe. So we instead create 1033 * the new pipe first. 1034 */ 1035 gss_pipe = gss_pipe_get(clnt, "gssd", &gss_upcall_ops_v1); 1036 if (IS_ERR(gss_pipe)) { 1037 err = PTR_ERR(gss_pipe); 1038 goto err_destroy_credcache; 1039 } 1040 gss_auth->gss_pipe[1] = gss_pipe; 1041 1042 gss_pipe = gss_pipe_get(clnt, gss_auth->mech->gm_name, 1043 &gss_upcall_ops_v0); 1044 if (IS_ERR(gss_pipe)) { 1045 err = PTR_ERR(gss_pipe); 1046 goto err_destroy_pipe_1; 1047 } 1048 gss_auth->gss_pipe[0] = gss_pipe; 1049 1050 return gss_auth; 1051 err_destroy_pipe_1: 1052 gss_pipe_free(gss_auth->gss_pipe[1]); 1053 err_destroy_credcache: 1054 rpcauth_destroy_credcache(auth); 1055 err_put_mech: 1056 gss_mech_put(gss_auth->mech); 1057 err_put_net: 1058 put_net(gss_auth->net); 1059 err_free: 1060 kfree(gss_auth->target_name); 1061 kfree(gss_auth); 1062 out_dec: 1063 module_put(THIS_MODULE); 1064 return ERR_PTR(err); 1065 } 1066 1067 static void 1068 gss_free(struct gss_auth *gss_auth) 1069 { 1070 gss_pipe_free(gss_auth->gss_pipe[0]); 1071 gss_pipe_free(gss_auth->gss_pipe[1]); 1072 gss_mech_put(gss_auth->mech); 1073 put_net(gss_auth->net); 1074 kfree(gss_auth->target_name); 1075 1076 kfree(gss_auth); 1077 module_put(THIS_MODULE); 1078 } 1079 1080 static void 1081 gss_free_callback(struct kref *kref) 1082 { 1083 struct gss_auth *gss_auth = container_of(kref, struct gss_auth, kref); 1084 1085 gss_free(gss_auth); 1086 } 1087 1088 static void 1089 gss_put_auth(struct gss_auth *gss_auth) 1090 { 1091 kref_put(&gss_auth->kref, gss_free_callback); 1092 } 1093 1094 static void 1095 gss_destroy(struct rpc_auth *auth) 1096 { 1097 struct gss_auth *gss_auth = container_of(auth, 1098 struct gss_auth, rpc_auth); 1099 1100 dprintk("RPC: destroying GSS authenticator %p flavor %d\n", 1101 auth, auth->au_flavor); 1102 1103 if (hash_hashed(&gss_auth->hash)) { 1104 spin_lock(&gss_auth_hash_lock); 1105 hash_del(&gss_auth->hash); 1106 spin_unlock(&gss_auth_hash_lock); 1107 } 1108 1109 gss_pipe_free(gss_auth->gss_pipe[0]); 1110 gss_auth->gss_pipe[0] = NULL; 1111 gss_pipe_free(gss_auth->gss_pipe[1]); 1112 gss_auth->gss_pipe[1] = NULL; 1113 rpcauth_destroy_credcache(auth); 1114 1115 gss_put_auth(gss_auth); 1116 } 1117 1118 /* 1119 * Auths may be shared between rpc clients that were cloned from a 1120 * common client with the same xprt, if they also share the flavor and 1121 * target_name. 1122 * 1123 * The auth is looked up from the oldest parent sharing the same 1124 * cl_xprt, and the auth itself references only that common parent 1125 * (which is guaranteed to last as long as any of its descendants). 1126 */ 1127 static struct gss_auth * 1128 gss_auth_find_or_add_hashed(struct rpc_auth_create_args *args, 1129 struct rpc_clnt *clnt, 1130 struct gss_auth *new) 1131 { 1132 struct gss_auth *gss_auth; 1133 unsigned long hashval = (unsigned long)clnt; 1134 1135 spin_lock(&gss_auth_hash_lock); 1136 hash_for_each_possible(gss_auth_hash_table, 1137 gss_auth, 1138 hash, 1139 hashval) { 1140 if (gss_auth->client != clnt) 1141 continue; 1142 if (gss_auth->rpc_auth.au_flavor != args->pseudoflavor) 1143 continue; 1144 if (gss_auth->target_name != args->target_name) { 1145 if (gss_auth->target_name == NULL) 1146 continue; 1147 if (args->target_name == NULL) 1148 continue; 1149 if (strcmp(gss_auth->target_name, args->target_name)) 1150 continue; 1151 } 1152 if (!atomic_inc_not_zero(&gss_auth->rpc_auth.au_count)) 1153 continue; 1154 goto out; 1155 } 1156 if (new) 1157 hash_add(gss_auth_hash_table, &new->hash, hashval); 1158 gss_auth = new; 1159 out: 1160 spin_unlock(&gss_auth_hash_lock); 1161 return gss_auth; 1162 } 1163 1164 static struct gss_auth * 1165 gss_create_hashed(struct rpc_auth_create_args *args, struct rpc_clnt *clnt) 1166 { 1167 struct gss_auth *gss_auth; 1168 struct gss_auth *new; 1169 1170 gss_auth = gss_auth_find_or_add_hashed(args, clnt, NULL); 1171 if (gss_auth != NULL) 1172 goto out; 1173 new = gss_create_new(args, clnt); 1174 if (IS_ERR(new)) 1175 return new; 1176 gss_auth = gss_auth_find_or_add_hashed(args, clnt, new); 1177 if (gss_auth != new) 1178 gss_destroy(&new->rpc_auth); 1179 out: 1180 return gss_auth; 1181 } 1182 1183 static struct rpc_auth * 1184 gss_create(struct rpc_auth_create_args *args, struct rpc_clnt *clnt) 1185 { 1186 struct gss_auth *gss_auth; 1187 struct rpc_xprt_switch *xps = rcu_access_pointer(clnt->cl_xpi.xpi_xpswitch); 1188 1189 while (clnt != clnt->cl_parent) { 1190 struct rpc_clnt *parent = clnt->cl_parent; 1191 /* Find the original parent for this transport */ 1192 if (rcu_access_pointer(parent->cl_xpi.xpi_xpswitch) != xps) 1193 break; 1194 clnt = parent; 1195 } 1196 1197 gss_auth = gss_create_hashed(args, clnt); 1198 if (IS_ERR(gss_auth)) 1199 return ERR_CAST(gss_auth); 1200 return &gss_auth->rpc_auth; 1201 } 1202 1203 /* 1204 * gss_destroying_context will cause the RPCSEC_GSS to send a NULL RPC call 1205 * to the server with the GSS control procedure field set to 1206 * RPC_GSS_PROC_DESTROY. This should normally cause the server to release 1207 * all RPCSEC_GSS state associated with that context. 1208 */ 1209 static int 1210 gss_destroying_context(struct rpc_cred *cred) 1211 { 1212 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base); 1213 struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth, rpc_auth); 1214 struct gss_cl_ctx *ctx = rcu_dereference_protected(gss_cred->gc_ctx, 1); 1215 struct rpc_task *task; 1216 1217 if (test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags) == 0) 1218 return 0; 1219 1220 ctx->gc_proc = RPC_GSS_PROC_DESTROY; 1221 cred->cr_ops = &gss_nullops; 1222 1223 /* Take a reference to ensure the cred will be destroyed either 1224 * by the RPC call or by the put_rpccred() below */ 1225 get_rpccred(cred); 1226 1227 task = rpc_call_null(gss_auth->client, cred, RPC_TASK_ASYNC|RPC_TASK_SOFT); 1228 if (!IS_ERR(task)) 1229 rpc_put_task(task); 1230 1231 put_rpccred(cred); 1232 return 1; 1233 } 1234 1235 /* gss_destroy_cred (and gss_free_ctx) are used to clean up after failure 1236 * to create a new cred or context, so they check that things have been 1237 * allocated before freeing them. */ 1238 static void 1239 gss_do_free_ctx(struct gss_cl_ctx *ctx) 1240 { 1241 dprintk("RPC: %s\n", __func__); 1242 1243 gss_delete_sec_context(&ctx->gc_gss_ctx); 1244 kfree(ctx->gc_wire_ctx.data); 1245 kfree(ctx->gc_acceptor.data); 1246 kfree(ctx); 1247 } 1248 1249 static void 1250 gss_free_ctx_callback(struct rcu_head *head) 1251 { 1252 struct gss_cl_ctx *ctx = container_of(head, struct gss_cl_ctx, gc_rcu); 1253 gss_do_free_ctx(ctx); 1254 } 1255 1256 static void 1257 gss_free_ctx(struct gss_cl_ctx *ctx) 1258 { 1259 call_rcu(&ctx->gc_rcu, gss_free_ctx_callback); 1260 } 1261 1262 static void 1263 gss_free_cred(struct gss_cred *gss_cred) 1264 { 1265 dprintk("RPC: %s cred=%p\n", __func__, gss_cred); 1266 kfree(gss_cred); 1267 } 1268 1269 static void 1270 gss_free_cred_callback(struct rcu_head *head) 1271 { 1272 struct gss_cred *gss_cred = container_of(head, struct gss_cred, gc_base.cr_rcu); 1273 gss_free_cred(gss_cred); 1274 } 1275 1276 static void 1277 gss_destroy_nullcred(struct rpc_cred *cred) 1278 { 1279 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base); 1280 struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth, rpc_auth); 1281 struct gss_cl_ctx *ctx = rcu_dereference_protected(gss_cred->gc_ctx, 1); 1282 1283 RCU_INIT_POINTER(gss_cred->gc_ctx, NULL); 1284 call_rcu(&cred->cr_rcu, gss_free_cred_callback); 1285 if (ctx) 1286 gss_put_ctx(ctx); 1287 gss_put_auth(gss_auth); 1288 } 1289 1290 static void 1291 gss_destroy_cred(struct rpc_cred *cred) 1292 { 1293 1294 if (gss_destroying_context(cred)) 1295 return; 1296 gss_destroy_nullcred(cred); 1297 } 1298 1299 /* 1300 * Lookup RPCSEC_GSS cred for the current process 1301 */ 1302 static struct rpc_cred * 1303 gss_lookup_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags) 1304 { 1305 return rpcauth_lookup_credcache(auth, acred, flags, GFP_NOFS); 1306 } 1307 1308 static struct rpc_cred * 1309 gss_create_cred(struct rpc_auth *auth, struct auth_cred *acred, int flags, gfp_t gfp) 1310 { 1311 struct gss_auth *gss_auth = container_of(auth, struct gss_auth, rpc_auth); 1312 struct gss_cred *cred = NULL; 1313 int err = -ENOMEM; 1314 1315 dprintk("RPC: %s for uid %d, flavor %d\n", 1316 __func__, from_kuid(&init_user_ns, acred->uid), 1317 auth->au_flavor); 1318 1319 if (!(cred = kzalloc(sizeof(*cred), gfp))) 1320 goto out_err; 1321 1322 rpcauth_init_cred(&cred->gc_base, acred, auth, &gss_credops); 1323 /* 1324 * Note: in order to force a call to call_refresh(), we deliberately 1325 * fail to flag the credential as RPCAUTH_CRED_UPTODATE. 1326 */ 1327 cred->gc_base.cr_flags = 1UL << RPCAUTH_CRED_NEW; 1328 cred->gc_service = gss_auth->service; 1329 cred->gc_principal = NULL; 1330 if (acred->machine_cred) 1331 cred->gc_principal = acred->principal; 1332 kref_get(&gss_auth->kref); 1333 return &cred->gc_base; 1334 1335 out_err: 1336 dprintk("RPC: %s failed with error %d\n", __func__, err); 1337 return ERR_PTR(err); 1338 } 1339 1340 static int 1341 gss_cred_init(struct rpc_auth *auth, struct rpc_cred *cred) 1342 { 1343 struct gss_auth *gss_auth = container_of(auth, struct gss_auth, rpc_auth); 1344 struct gss_cred *gss_cred = container_of(cred,struct gss_cred, gc_base); 1345 int err; 1346 1347 do { 1348 err = gss_create_upcall(gss_auth, gss_cred); 1349 } while (err == -EAGAIN); 1350 return err; 1351 } 1352 1353 static char * 1354 gss_stringify_acceptor(struct rpc_cred *cred) 1355 { 1356 char *string = NULL; 1357 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, gc_base); 1358 struct gss_cl_ctx *ctx; 1359 unsigned int len; 1360 struct xdr_netobj *acceptor; 1361 1362 rcu_read_lock(); 1363 ctx = rcu_dereference(gss_cred->gc_ctx); 1364 if (!ctx) 1365 goto out; 1366 1367 len = ctx->gc_acceptor.len; 1368 rcu_read_unlock(); 1369 1370 /* no point if there's no string */ 1371 if (!len) 1372 return NULL; 1373 realloc: 1374 string = kmalloc(len + 1, GFP_KERNEL); 1375 if (!string) 1376 return NULL; 1377 1378 rcu_read_lock(); 1379 ctx = rcu_dereference(gss_cred->gc_ctx); 1380 1381 /* did the ctx disappear or was it replaced by one with no acceptor? */ 1382 if (!ctx || !ctx->gc_acceptor.len) { 1383 kfree(string); 1384 string = NULL; 1385 goto out; 1386 } 1387 1388 acceptor = &ctx->gc_acceptor; 1389 1390 /* 1391 * Did we find a new acceptor that's longer than the original? Allocate 1392 * a longer buffer and try again. 1393 */ 1394 if (len < acceptor->len) { 1395 len = acceptor->len; 1396 rcu_read_unlock(); 1397 kfree(string); 1398 goto realloc; 1399 } 1400 1401 memcpy(string, acceptor->data, acceptor->len); 1402 string[acceptor->len] = '\0'; 1403 out: 1404 rcu_read_unlock(); 1405 return string; 1406 } 1407 1408 /* 1409 * Returns -EACCES if GSS context is NULL or will expire within the 1410 * timeout (miliseconds) 1411 */ 1412 static int 1413 gss_key_timeout(struct rpc_cred *rc) 1414 { 1415 struct gss_cred *gss_cred = container_of(rc, struct gss_cred, gc_base); 1416 struct gss_cl_ctx *ctx; 1417 unsigned long timeout = jiffies + (gss_key_expire_timeo * HZ); 1418 int ret = 0; 1419 1420 rcu_read_lock(); 1421 ctx = rcu_dereference(gss_cred->gc_ctx); 1422 if (!ctx || time_after(timeout, ctx->gc_expiry)) 1423 ret = -EACCES; 1424 rcu_read_unlock(); 1425 1426 return ret; 1427 } 1428 1429 static int 1430 gss_match(struct auth_cred *acred, struct rpc_cred *rc, int flags) 1431 { 1432 struct gss_cred *gss_cred = container_of(rc, struct gss_cred, gc_base); 1433 struct gss_cl_ctx *ctx; 1434 int ret; 1435 1436 if (test_bit(RPCAUTH_CRED_NEW, &rc->cr_flags)) 1437 goto out; 1438 /* Don't match with creds that have expired. */ 1439 rcu_read_lock(); 1440 ctx = rcu_dereference(gss_cred->gc_ctx); 1441 if (!ctx || time_after(jiffies, ctx->gc_expiry)) { 1442 rcu_read_unlock(); 1443 return 0; 1444 } 1445 rcu_read_unlock(); 1446 if (!test_bit(RPCAUTH_CRED_UPTODATE, &rc->cr_flags)) 1447 return 0; 1448 out: 1449 if (acred->principal != NULL) { 1450 if (gss_cred->gc_principal == NULL) 1451 return 0; 1452 ret = strcmp(acred->principal, gss_cred->gc_principal) == 0; 1453 goto check_expire; 1454 } 1455 if (gss_cred->gc_principal != NULL) 1456 return 0; 1457 ret = uid_eq(rc->cr_uid, acred->uid); 1458 1459 check_expire: 1460 if (ret == 0) 1461 return ret; 1462 1463 /* Notify acred users of GSS context expiration timeout */ 1464 if (test_bit(RPC_CRED_NOTIFY_TIMEOUT, &acred->ac_flags) && 1465 (gss_key_timeout(rc) != 0)) { 1466 /* test will now be done from generic cred */ 1467 test_and_clear_bit(RPC_CRED_NOTIFY_TIMEOUT, &acred->ac_flags); 1468 /* tell NFS layer that key will expire soon */ 1469 set_bit(RPC_CRED_KEY_EXPIRE_SOON, &acred->ac_flags); 1470 } 1471 return ret; 1472 } 1473 1474 /* 1475 * Marshal credentials. 1476 * Maybe we should keep a cached credential for performance reasons. 1477 */ 1478 static __be32 * 1479 gss_marshal(struct rpc_task *task, __be32 *p) 1480 { 1481 struct rpc_rqst *req = task->tk_rqstp; 1482 struct rpc_cred *cred = req->rq_cred; 1483 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, 1484 gc_base); 1485 struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); 1486 __be32 *cred_len; 1487 u32 maj_stat = 0; 1488 struct xdr_netobj mic; 1489 struct kvec iov; 1490 struct xdr_buf verf_buf; 1491 1492 dprintk("RPC: %5u %s\n", task->tk_pid, __func__); 1493 1494 *p++ = htonl(RPC_AUTH_GSS); 1495 cred_len = p++; 1496 1497 spin_lock(&ctx->gc_seq_lock); 1498 req->rq_seqno = ctx->gc_seq++; 1499 spin_unlock(&ctx->gc_seq_lock); 1500 1501 *p++ = htonl((u32) RPC_GSS_VERSION); 1502 *p++ = htonl((u32) ctx->gc_proc); 1503 *p++ = htonl((u32) req->rq_seqno); 1504 *p++ = htonl((u32) gss_cred->gc_service); 1505 p = xdr_encode_netobj(p, &ctx->gc_wire_ctx); 1506 *cred_len = htonl((p - (cred_len + 1)) << 2); 1507 1508 /* We compute the checksum for the verifier over the xdr-encoded bytes 1509 * starting with the xid and ending at the end of the credential: */ 1510 iov.iov_base = xprt_skip_transport_header(req->rq_xprt, 1511 req->rq_snd_buf.head[0].iov_base); 1512 iov.iov_len = (u8 *)p - (u8 *)iov.iov_base; 1513 xdr_buf_from_iov(&iov, &verf_buf); 1514 1515 /* set verifier flavor*/ 1516 *p++ = htonl(RPC_AUTH_GSS); 1517 1518 mic.data = (u8 *)(p + 1); 1519 maj_stat = gss_get_mic(ctx->gc_gss_ctx, &verf_buf, &mic); 1520 if (maj_stat == GSS_S_CONTEXT_EXPIRED) { 1521 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1522 } else if (maj_stat != 0) { 1523 printk("gss_marshal: gss_get_mic FAILED (%d)\n", maj_stat); 1524 goto out_put_ctx; 1525 } 1526 p = xdr_encode_opaque(p, NULL, mic.len); 1527 gss_put_ctx(ctx); 1528 return p; 1529 out_put_ctx: 1530 gss_put_ctx(ctx); 1531 return NULL; 1532 } 1533 1534 static int gss_renew_cred(struct rpc_task *task) 1535 { 1536 struct rpc_cred *oldcred = task->tk_rqstp->rq_cred; 1537 struct gss_cred *gss_cred = container_of(oldcred, 1538 struct gss_cred, 1539 gc_base); 1540 struct rpc_auth *auth = oldcred->cr_auth; 1541 struct auth_cred acred = { 1542 .uid = oldcred->cr_uid, 1543 .principal = gss_cred->gc_principal, 1544 .machine_cred = (gss_cred->gc_principal != NULL ? 1 : 0), 1545 }; 1546 struct rpc_cred *new; 1547 1548 new = gss_lookup_cred(auth, &acred, RPCAUTH_LOOKUP_NEW); 1549 if (IS_ERR(new)) 1550 return PTR_ERR(new); 1551 task->tk_rqstp->rq_cred = new; 1552 put_rpccred(oldcred); 1553 return 0; 1554 } 1555 1556 static int gss_cred_is_negative_entry(struct rpc_cred *cred) 1557 { 1558 if (test_bit(RPCAUTH_CRED_NEGATIVE, &cred->cr_flags)) { 1559 unsigned long now = jiffies; 1560 unsigned long begin, expire; 1561 struct gss_cred *gss_cred; 1562 1563 gss_cred = container_of(cred, struct gss_cred, gc_base); 1564 begin = gss_cred->gc_upcall_timestamp; 1565 expire = begin + gss_expired_cred_retry_delay * HZ; 1566 1567 if (time_in_range_open(now, begin, expire)) 1568 return 1; 1569 } 1570 return 0; 1571 } 1572 1573 /* 1574 * Refresh credentials. XXX - finish 1575 */ 1576 static int 1577 gss_refresh(struct rpc_task *task) 1578 { 1579 struct rpc_cred *cred = task->tk_rqstp->rq_cred; 1580 int ret = 0; 1581 1582 if (gss_cred_is_negative_entry(cred)) 1583 return -EKEYEXPIRED; 1584 1585 if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags) && 1586 !test_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags)) { 1587 ret = gss_renew_cred(task); 1588 if (ret < 0) 1589 goto out; 1590 cred = task->tk_rqstp->rq_cred; 1591 } 1592 1593 if (test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags)) 1594 ret = gss_refresh_upcall(task); 1595 out: 1596 return ret; 1597 } 1598 1599 /* Dummy refresh routine: used only when destroying the context */ 1600 static int 1601 gss_refresh_null(struct rpc_task *task) 1602 { 1603 return 0; 1604 } 1605 1606 static __be32 * 1607 gss_validate(struct rpc_task *task, __be32 *p) 1608 { 1609 struct rpc_cred *cred = task->tk_rqstp->rq_cred; 1610 struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); 1611 __be32 seq; 1612 struct kvec iov; 1613 struct xdr_buf verf_buf; 1614 struct xdr_netobj mic; 1615 u32 flav,len; 1616 u32 maj_stat; 1617 __be32 *ret = ERR_PTR(-EIO); 1618 1619 dprintk("RPC: %5u %s\n", task->tk_pid, __func__); 1620 1621 flav = ntohl(*p++); 1622 if ((len = ntohl(*p++)) > RPC_MAX_AUTH_SIZE) 1623 goto out_bad; 1624 if (flav != RPC_AUTH_GSS) 1625 goto out_bad; 1626 seq = htonl(task->tk_rqstp->rq_seqno); 1627 iov.iov_base = &seq; 1628 iov.iov_len = sizeof(seq); 1629 xdr_buf_from_iov(&iov, &verf_buf); 1630 mic.data = (u8 *)p; 1631 mic.len = len; 1632 1633 ret = ERR_PTR(-EACCES); 1634 maj_stat = gss_verify_mic(ctx->gc_gss_ctx, &verf_buf, &mic); 1635 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1636 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1637 if (maj_stat) { 1638 dprintk("RPC: %5u %s: gss_verify_mic returned error 0x%08x\n", 1639 task->tk_pid, __func__, maj_stat); 1640 goto out_bad; 1641 } 1642 /* We leave it to unwrap to calculate au_rslack. For now we just 1643 * calculate the length of the verifier: */ 1644 cred->cr_auth->au_verfsize = XDR_QUADLEN(len) + 2; 1645 gss_put_ctx(ctx); 1646 dprintk("RPC: %5u %s: gss_verify_mic succeeded.\n", 1647 task->tk_pid, __func__); 1648 return p + XDR_QUADLEN(len); 1649 out_bad: 1650 gss_put_ctx(ctx); 1651 dprintk("RPC: %5u %s failed ret %ld.\n", task->tk_pid, __func__, 1652 PTR_ERR(ret)); 1653 return ret; 1654 } 1655 1656 static void gss_wrap_req_encode(kxdreproc_t encode, struct rpc_rqst *rqstp, 1657 __be32 *p, void *obj) 1658 { 1659 struct xdr_stream xdr; 1660 1661 xdr_init_encode(&xdr, &rqstp->rq_snd_buf, p); 1662 encode(rqstp, &xdr, obj); 1663 } 1664 1665 static inline int 1666 gss_wrap_req_integ(struct rpc_cred *cred, struct gss_cl_ctx *ctx, 1667 kxdreproc_t encode, struct rpc_rqst *rqstp, 1668 __be32 *p, void *obj) 1669 { 1670 struct xdr_buf *snd_buf = &rqstp->rq_snd_buf; 1671 struct xdr_buf integ_buf; 1672 __be32 *integ_len = NULL; 1673 struct xdr_netobj mic; 1674 u32 offset; 1675 __be32 *q; 1676 struct kvec *iov; 1677 u32 maj_stat = 0; 1678 int status = -EIO; 1679 1680 integ_len = p++; 1681 offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base; 1682 *p++ = htonl(rqstp->rq_seqno); 1683 1684 gss_wrap_req_encode(encode, rqstp, p, obj); 1685 1686 if (xdr_buf_subsegment(snd_buf, &integ_buf, 1687 offset, snd_buf->len - offset)) 1688 return status; 1689 *integ_len = htonl(integ_buf.len); 1690 1691 /* guess whether we're in the head or the tail: */ 1692 if (snd_buf->page_len || snd_buf->tail[0].iov_len) 1693 iov = snd_buf->tail; 1694 else 1695 iov = snd_buf->head; 1696 p = iov->iov_base + iov->iov_len; 1697 mic.data = (u8 *)(p + 1); 1698 1699 maj_stat = gss_get_mic(ctx->gc_gss_ctx, &integ_buf, &mic); 1700 status = -EIO; /* XXX? */ 1701 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1702 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1703 else if (maj_stat) 1704 return status; 1705 q = xdr_encode_opaque(p, NULL, mic.len); 1706 1707 offset = (u8 *)q - (u8 *)p; 1708 iov->iov_len += offset; 1709 snd_buf->len += offset; 1710 return 0; 1711 } 1712 1713 static void 1714 priv_release_snd_buf(struct rpc_rqst *rqstp) 1715 { 1716 int i; 1717 1718 for (i=0; i < rqstp->rq_enc_pages_num; i++) 1719 __free_page(rqstp->rq_enc_pages[i]); 1720 kfree(rqstp->rq_enc_pages); 1721 } 1722 1723 static int 1724 alloc_enc_pages(struct rpc_rqst *rqstp) 1725 { 1726 struct xdr_buf *snd_buf = &rqstp->rq_snd_buf; 1727 int first, last, i; 1728 1729 if (snd_buf->page_len == 0) { 1730 rqstp->rq_enc_pages_num = 0; 1731 return 0; 1732 } 1733 1734 first = snd_buf->page_base >> PAGE_SHIFT; 1735 last = (snd_buf->page_base + snd_buf->page_len - 1) >> PAGE_SHIFT; 1736 rqstp->rq_enc_pages_num = last - first + 1 + 1; 1737 rqstp->rq_enc_pages 1738 = kmalloc(rqstp->rq_enc_pages_num * sizeof(struct page *), 1739 GFP_NOFS); 1740 if (!rqstp->rq_enc_pages) 1741 goto out; 1742 for (i=0; i < rqstp->rq_enc_pages_num; i++) { 1743 rqstp->rq_enc_pages[i] = alloc_page(GFP_NOFS); 1744 if (rqstp->rq_enc_pages[i] == NULL) 1745 goto out_free; 1746 } 1747 rqstp->rq_release_snd_buf = priv_release_snd_buf; 1748 return 0; 1749 out_free: 1750 rqstp->rq_enc_pages_num = i; 1751 priv_release_snd_buf(rqstp); 1752 out: 1753 return -EAGAIN; 1754 } 1755 1756 static inline int 1757 gss_wrap_req_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx, 1758 kxdreproc_t encode, struct rpc_rqst *rqstp, 1759 __be32 *p, void *obj) 1760 { 1761 struct xdr_buf *snd_buf = &rqstp->rq_snd_buf; 1762 u32 offset; 1763 u32 maj_stat; 1764 int status; 1765 __be32 *opaque_len; 1766 struct page **inpages; 1767 int first; 1768 int pad; 1769 struct kvec *iov; 1770 char *tmp; 1771 1772 opaque_len = p++; 1773 offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base; 1774 *p++ = htonl(rqstp->rq_seqno); 1775 1776 gss_wrap_req_encode(encode, rqstp, p, obj); 1777 1778 status = alloc_enc_pages(rqstp); 1779 if (status) 1780 return status; 1781 first = snd_buf->page_base >> PAGE_SHIFT; 1782 inpages = snd_buf->pages + first; 1783 snd_buf->pages = rqstp->rq_enc_pages; 1784 snd_buf->page_base -= first << PAGE_SHIFT; 1785 /* 1786 * Give the tail its own page, in case we need extra space in the 1787 * head when wrapping: 1788 * 1789 * call_allocate() allocates twice the slack space required 1790 * by the authentication flavor to rq_callsize. 1791 * For GSS, slack is GSS_CRED_SLACK. 1792 */ 1793 if (snd_buf->page_len || snd_buf->tail[0].iov_len) { 1794 tmp = page_address(rqstp->rq_enc_pages[rqstp->rq_enc_pages_num - 1]); 1795 memcpy(tmp, snd_buf->tail[0].iov_base, snd_buf->tail[0].iov_len); 1796 snd_buf->tail[0].iov_base = tmp; 1797 } 1798 maj_stat = gss_wrap(ctx->gc_gss_ctx, offset, snd_buf, inpages); 1799 /* slack space should prevent this ever happening: */ 1800 BUG_ON(snd_buf->len > snd_buf->buflen); 1801 status = -EIO; 1802 /* We're assuming that when GSS_S_CONTEXT_EXPIRED, the encryption was 1803 * done anyway, so it's safe to put the request on the wire: */ 1804 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1805 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1806 else if (maj_stat) 1807 return status; 1808 1809 *opaque_len = htonl(snd_buf->len - offset); 1810 /* guess whether we're in the head or the tail: */ 1811 if (snd_buf->page_len || snd_buf->tail[0].iov_len) 1812 iov = snd_buf->tail; 1813 else 1814 iov = snd_buf->head; 1815 p = iov->iov_base + iov->iov_len; 1816 pad = 3 - ((snd_buf->len - offset - 1) & 3); 1817 memset(p, 0, pad); 1818 iov->iov_len += pad; 1819 snd_buf->len += pad; 1820 1821 return 0; 1822 } 1823 1824 static int 1825 gss_wrap_req(struct rpc_task *task, 1826 kxdreproc_t encode, void *rqstp, __be32 *p, void *obj) 1827 { 1828 struct rpc_cred *cred = task->tk_rqstp->rq_cred; 1829 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, 1830 gc_base); 1831 struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); 1832 int status = -EIO; 1833 1834 dprintk("RPC: %5u %s\n", task->tk_pid, __func__); 1835 if (ctx->gc_proc != RPC_GSS_PROC_DATA) { 1836 /* The spec seems a little ambiguous here, but I think that not 1837 * wrapping context destruction requests makes the most sense. 1838 */ 1839 gss_wrap_req_encode(encode, rqstp, p, obj); 1840 status = 0; 1841 goto out; 1842 } 1843 switch (gss_cred->gc_service) { 1844 case RPC_GSS_SVC_NONE: 1845 gss_wrap_req_encode(encode, rqstp, p, obj); 1846 status = 0; 1847 break; 1848 case RPC_GSS_SVC_INTEGRITY: 1849 status = gss_wrap_req_integ(cred, ctx, encode, rqstp, p, obj); 1850 break; 1851 case RPC_GSS_SVC_PRIVACY: 1852 status = gss_wrap_req_priv(cred, ctx, encode, rqstp, p, obj); 1853 break; 1854 } 1855 out: 1856 gss_put_ctx(ctx); 1857 dprintk("RPC: %5u %s returning %d\n", task->tk_pid, __func__, status); 1858 return status; 1859 } 1860 1861 static inline int 1862 gss_unwrap_resp_integ(struct rpc_cred *cred, struct gss_cl_ctx *ctx, 1863 struct rpc_rqst *rqstp, __be32 **p) 1864 { 1865 struct xdr_buf *rcv_buf = &rqstp->rq_rcv_buf; 1866 struct xdr_buf integ_buf; 1867 struct xdr_netobj mic; 1868 u32 data_offset, mic_offset; 1869 u32 integ_len; 1870 u32 maj_stat; 1871 int status = -EIO; 1872 1873 integ_len = ntohl(*(*p)++); 1874 if (integ_len & 3) 1875 return status; 1876 data_offset = (u8 *)(*p) - (u8 *)rcv_buf->head[0].iov_base; 1877 mic_offset = integ_len + data_offset; 1878 if (mic_offset > rcv_buf->len) 1879 return status; 1880 if (ntohl(*(*p)++) != rqstp->rq_seqno) 1881 return status; 1882 1883 if (xdr_buf_subsegment(rcv_buf, &integ_buf, data_offset, 1884 mic_offset - data_offset)) 1885 return status; 1886 1887 if (xdr_buf_read_netobj(rcv_buf, &mic, mic_offset)) 1888 return status; 1889 1890 maj_stat = gss_verify_mic(ctx->gc_gss_ctx, &integ_buf, &mic); 1891 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1892 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1893 if (maj_stat != GSS_S_COMPLETE) 1894 return status; 1895 return 0; 1896 } 1897 1898 static inline int 1899 gss_unwrap_resp_priv(struct rpc_cred *cred, struct gss_cl_ctx *ctx, 1900 struct rpc_rqst *rqstp, __be32 **p) 1901 { 1902 struct xdr_buf *rcv_buf = &rqstp->rq_rcv_buf; 1903 u32 offset; 1904 u32 opaque_len; 1905 u32 maj_stat; 1906 int status = -EIO; 1907 1908 opaque_len = ntohl(*(*p)++); 1909 offset = (u8 *)(*p) - (u8 *)rcv_buf->head[0].iov_base; 1910 if (offset + opaque_len > rcv_buf->len) 1911 return status; 1912 /* remove padding: */ 1913 rcv_buf->len = offset + opaque_len; 1914 1915 maj_stat = gss_unwrap(ctx->gc_gss_ctx, offset, rcv_buf); 1916 if (maj_stat == GSS_S_CONTEXT_EXPIRED) 1917 clear_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags); 1918 if (maj_stat != GSS_S_COMPLETE) 1919 return status; 1920 if (ntohl(*(*p)++) != rqstp->rq_seqno) 1921 return status; 1922 1923 return 0; 1924 } 1925 1926 static int 1927 gss_unwrap_req_decode(kxdrdproc_t decode, struct rpc_rqst *rqstp, 1928 __be32 *p, void *obj) 1929 { 1930 struct xdr_stream xdr; 1931 1932 xdr_init_decode(&xdr, &rqstp->rq_rcv_buf, p); 1933 return decode(rqstp, &xdr, obj); 1934 } 1935 1936 static int 1937 gss_unwrap_resp(struct rpc_task *task, 1938 kxdrdproc_t decode, void *rqstp, __be32 *p, void *obj) 1939 { 1940 struct rpc_cred *cred = task->tk_rqstp->rq_cred; 1941 struct gss_cred *gss_cred = container_of(cred, struct gss_cred, 1942 gc_base); 1943 struct gss_cl_ctx *ctx = gss_cred_get_ctx(cred); 1944 __be32 *savedp = p; 1945 struct kvec *head = ((struct rpc_rqst *)rqstp)->rq_rcv_buf.head; 1946 int savedlen = head->iov_len; 1947 int status = -EIO; 1948 1949 if (ctx->gc_proc != RPC_GSS_PROC_DATA) 1950 goto out_decode; 1951 switch (gss_cred->gc_service) { 1952 case RPC_GSS_SVC_NONE: 1953 break; 1954 case RPC_GSS_SVC_INTEGRITY: 1955 status = gss_unwrap_resp_integ(cred, ctx, rqstp, &p); 1956 if (status) 1957 goto out; 1958 break; 1959 case RPC_GSS_SVC_PRIVACY: 1960 status = gss_unwrap_resp_priv(cred, ctx, rqstp, &p); 1961 if (status) 1962 goto out; 1963 break; 1964 } 1965 /* take into account extra slack for integrity and privacy cases: */ 1966 cred->cr_auth->au_rslack = cred->cr_auth->au_verfsize + (p - savedp) 1967 + (savedlen - head->iov_len); 1968 out_decode: 1969 status = gss_unwrap_req_decode(decode, rqstp, p, obj); 1970 out: 1971 gss_put_ctx(ctx); 1972 dprintk("RPC: %5u %s returning %d\n", 1973 task->tk_pid, __func__, status); 1974 return status; 1975 } 1976 1977 static const struct rpc_authops authgss_ops = { 1978 .owner = THIS_MODULE, 1979 .au_flavor = RPC_AUTH_GSS, 1980 .au_name = "RPCSEC_GSS", 1981 .create = gss_create, 1982 .destroy = gss_destroy, 1983 .lookup_cred = gss_lookup_cred, 1984 .crcreate = gss_create_cred, 1985 .list_pseudoflavors = gss_mech_list_pseudoflavors, 1986 .info2flavor = gss_mech_info2flavor, 1987 .flavor2info = gss_mech_flavor2info, 1988 }; 1989 1990 static const struct rpc_credops gss_credops = { 1991 .cr_name = "AUTH_GSS", 1992 .crdestroy = gss_destroy_cred, 1993 .cr_init = gss_cred_init, 1994 .crbind = rpcauth_generic_bind_cred, 1995 .crmatch = gss_match, 1996 .crmarshal = gss_marshal, 1997 .crrefresh = gss_refresh, 1998 .crvalidate = gss_validate, 1999 .crwrap_req = gss_wrap_req, 2000 .crunwrap_resp = gss_unwrap_resp, 2001 .crkey_timeout = gss_key_timeout, 2002 .crstringify_acceptor = gss_stringify_acceptor, 2003 }; 2004 2005 static const struct rpc_credops gss_nullops = { 2006 .cr_name = "AUTH_GSS", 2007 .crdestroy = gss_destroy_nullcred, 2008 .crbind = rpcauth_generic_bind_cred, 2009 .crmatch = gss_match, 2010 .crmarshal = gss_marshal, 2011 .crrefresh = gss_refresh_null, 2012 .crvalidate = gss_validate, 2013 .crwrap_req = gss_wrap_req, 2014 .crunwrap_resp = gss_unwrap_resp, 2015 .crstringify_acceptor = gss_stringify_acceptor, 2016 }; 2017 2018 static const struct rpc_pipe_ops gss_upcall_ops_v0 = { 2019 .upcall = rpc_pipe_generic_upcall, 2020 .downcall = gss_pipe_downcall, 2021 .destroy_msg = gss_pipe_destroy_msg, 2022 .open_pipe = gss_pipe_open_v0, 2023 .release_pipe = gss_pipe_release, 2024 }; 2025 2026 static const struct rpc_pipe_ops gss_upcall_ops_v1 = { 2027 .upcall = rpc_pipe_generic_upcall, 2028 .downcall = gss_pipe_downcall, 2029 .destroy_msg = gss_pipe_destroy_msg, 2030 .open_pipe = gss_pipe_open_v1, 2031 .release_pipe = gss_pipe_release, 2032 }; 2033 2034 static __net_init int rpcsec_gss_init_net(struct net *net) 2035 { 2036 return gss_svc_init_net(net); 2037 } 2038 2039 static __net_exit void rpcsec_gss_exit_net(struct net *net) 2040 { 2041 gss_svc_shutdown_net(net); 2042 } 2043 2044 static struct pernet_operations rpcsec_gss_net_ops = { 2045 .init = rpcsec_gss_init_net, 2046 .exit = rpcsec_gss_exit_net, 2047 }; 2048 2049 /* 2050 * Initialize RPCSEC_GSS module 2051 */ 2052 static int __init init_rpcsec_gss(void) 2053 { 2054 int err = 0; 2055 2056 err = rpcauth_register(&authgss_ops); 2057 if (err) 2058 goto out; 2059 err = gss_svc_init(); 2060 if (err) 2061 goto out_unregister; 2062 err = register_pernet_subsys(&rpcsec_gss_net_ops); 2063 if (err) 2064 goto out_svc_exit; 2065 rpc_init_wait_queue(&pipe_version_rpc_waitqueue, "gss pipe version"); 2066 return 0; 2067 out_svc_exit: 2068 gss_svc_shutdown(); 2069 out_unregister: 2070 rpcauth_unregister(&authgss_ops); 2071 out: 2072 return err; 2073 } 2074 2075 static void __exit exit_rpcsec_gss(void) 2076 { 2077 unregister_pernet_subsys(&rpcsec_gss_net_ops); 2078 gss_svc_shutdown(); 2079 rpcauth_unregister(&authgss_ops); 2080 rcu_barrier(); /* Wait for completion of call_rcu()'s */ 2081 } 2082 2083 MODULE_ALIAS("rpc-auth-6"); 2084 MODULE_LICENSE("GPL"); 2085 module_param_named(expired_cred_retry_delay, 2086 gss_expired_cred_retry_delay, 2087 uint, 0644); 2088 MODULE_PARM_DESC(expired_cred_retry_delay, "Timeout (in seconds) until " 2089 "the RPC engine retries an expired credential"); 2090 2091 module_param_named(key_expire_timeo, 2092 gss_key_expire_timeo, 2093 uint, 0644); 2094 MODULE_PARM_DESC(key_expire_timeo, "Time (in seconds) at the end of a " 2095 "credential keys lifetime where the NFS layer cleans up " 2096 "prior to key expiration"); 2097 2098 module_init(init_rpcsec_gss) 2099 module_exit(exit_rpcsec_gss) 2100