Print this page
3354 kernel crash in rpcsec_gss after using gsscred
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Carlos Neira <cneirabustos@gmail.com>
Approved by: Robert Mustacchi <rm@joyent.com>
NEX-4123 xdrmblk_getpos() is unreliable
Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com>
Reviewed by: Yuri Pankov <yuri.pankov@nexenta.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/rpc/sec_gss/svc_rpcsec_gss.c
          +++ new/usr/src/uts/common/rpc/sec_gss/svc_rpcsec_gss.c
↓ open down ↓ 15 lines elided ↑ open up ↑
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  24   24   * Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved.
  25   25   * Copyright 2012 Milan Jurik. All rights reserved.
       26 + * Copyright 2012 Marcel Telka <marcel@telka.sk>
       27 + * Copyright 2018 OmniOS Community Edition (OmniOSce) Association.
  26   28   */
  27   29  
  28   30  /*
  29   31   * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved.
  30   32   *
  31   33   * $Id: svc_auth_gssapi.c,v 1.19 1994/10/27 12:38:51 jik Exp $
  32   34   */
  33   35  
  34   36  /*
  35   37   * Server side handling of RPCSEC_GSS flavor.
↓ open down ↓ 331 lines elided ↑ open up ↑
 367  369          if ((gethrestime_sec() - last_swept) > sweep_interval)
 368  370                  sweep_clients(FALSE);
 369  371  
 370  372          mutex_exit(&ctx_mutex);
 371  373  }
 372  374  
 373  375  /*
 374  376   * Shift the array arr of length arrlen right by nbits bits.
 375  377   */
 376  378  static void
 377      -shift_bits(arr, arrlen, nbits)
 378      -        uint_t  *arr;
 379      -        int     arrlen;
 380      -        int     nbits;
      379 +shift_bits(uint_t *arr, int arrlen, int nbits)
 381  380  {
 382  381          int     i, j;
 383  382          uint_t  lo, hi;
 384  383  
 385  384          /*
 386  385           * If the number of bits to be shifted exceeds SEQ_WIN, just
 387  386           * zero out the array.
 388  387           */
 389  388          if (nbits < SEQ_WIN) {
 390  389                  for (i = 0; i < nbits; i++) {
↓ open down ↓ 9 lines elided ↑ open up ↑
 400  399          } else {
 401  400                  for (j = 0; j < arrlen; j++)
 402  401                          arr[j] = 0;
 403  402          }
 404  403  }
 405  404  
 406  405  /*
 407  406   * Check that the received sequence number seq_num is valid.
 408  407   */
 409  408  static bool_t
 410      -check_seq(cl, seq_num, kill_context)
 411      -        svc_rpc_gss_data        *cl;
 412      -        uint_t                  seq_num;
 413      -        bool_t                  *kill_context;
      409 +check_seq(svc_rpc_gss_data *cl, uint_t seq_num, bool_t *kill_context)
 414  410  {
 415  411          int                     i, j;
 416  412          uint_t                  bit;
 417  413  
 418  414          /*
 419  415           * If it exceeds the maximum, kill context.
 420  416           */
 421  417          if (seq_num >= SEQ_MAX) {
 422  418                  *kill_context = TRUE;
 423  419                  RPCGSS_LOG0(4, "check_seq: seq_num not valid\n");
 424  420                  return (FALSE);
 425  421          }
 426  422  
 427  423          /*
 428  424           * If greater than the last seen sequence number, just shift
 429  425           * the sequence window so that it starts at the new sequence
 430  426           * number and extends downwards by SEQ_WIN.
 431  427           */
 432  428          if (seq_num > cl->seq_num) {
 433  429                  (void) shift_bits(cl->seq_bits, SEQ_ARR_SIZE,
 434      -                                (int)(seq_num - cl->seq_num));
      430 +                    (int)(seq_num - cl->seq_num));
 435  431                  cl->seq_bits[0] |= SEQ_HI_BIT;
 436  432                  cl->seq_num = seq_num;
 437  433                  return (TRUE);
 438  434          }
 439  435  
 440  436          /*
 441  437           * If it is outside the sequence window, return failure.
 442  438           */
 443  439          i = cl->seq_num - seq_num;
 444  440          if (i >= SEQ_WIN) {
↓ open down ↓ 13 lines elided ↑ open up ↑
 458  454                  return (FALSE);
 459  455          }
 460  456          cl->seq_bits[i] |= bit;
 461  457          return (TRUE);
 462  458  }
 463  459  
 464  460  /*
 465  461   * Set server callback.
 466  462   */
 467  463  bool_t
 468      -rpc_gss_set_callback(cb)
 469      -        rpc_gss_callback_t      *cb;
      464 +rpc_gss_set_callback(rpc_gss_callback_t *cb)
 470  465  {
 471  466          rpc_gss_cblist_t                *cbl, *tmp;
 472  467  
 473  468          if (cb->callback == NULL) {
 474  469                  RPCGSS_LOG0(1, "rpc_gss_set_callback: no callback to set\n");
 475  470                  return (FALSE);
 476  471          }
 477  472  
 478  473          /* check if there is already an entry in the rpc_gss_cblist. */
 479  474          mutex_enter(&cb_mutex);
↓ open down ↓ 21 lines elided ↑ open up ↑
 501  496          return (TRUE);
 502  497  }
 503  498  
 504  499  /*
 505  500   * Locate callback (if specified) and call server.  Release any
 506  501   * delegated credentials unless passed to server and the server
 507  502   * accepts the context.  If a callback is not specified, accept
 508  503   * the incoming context.
 509  504   */
 510  505  static bool_t
 511      -do_callback(req, client_data)
 512      -        struct svc_req          *req;
 513      -        svc_rpc_gss_data        *client_data;
      506 +do_callback(struct svc_req *req, svc_rpc_gss_data *client_data)
 514  507  {
 515  508          rpc_gss_cblist_t                *cbl;
 516  509          bool_t                  ret = TRUE, found = FALSE;
 517  510          rpc_gss_lock_t          lock;
 518  511          OM_uint32               minor;
 519  512          mutex_enter(&cb_mutex);
 520  513          for (cbl = rpc_gss_cblist; cbl != NULL; cbl = cbl->next) {
 521  514                  if (req->rq_prog != cbl->cb.program ||
 522      -                                        req->rq_vers != cbl->cb.version)
      515 +                    req->rq_vers != cbl->cb.version)
 523  516                          continue;
 524  517                  found = TRUE;
 525  518                  lock.locked = FALSE;
 526  519                  lock.raw_cred = &client_data->raw_cred;
 527  520                  ret = (*cbl->cb.callback)(req, client_data->deleg,
 528      -                        client_data->context, &lock, &client_data->cookie);
      521 +                    client_data->context, &lock, &client_data->cookie);
 529  522                  req->rq_xprt->xp_cookie = client_data->cookie;
 530  523  
 531  524                  if (ret) {
 532  525                          client_data->locked = lock.locked;
 533  526                          client_data->deleg = GSS_C_NO_CREDENTIAL;
 534  527                  }
 535  528                  break;
 536  529          }
 537  530          if (!found) {
 538  531                  if (client_data->deleg != GSS_C_NO_CREDENTIAL) {
 539  532                          (void) kgss_release_cred(&minor, &client_data->deleg,
 540      -                                        crgetuid(CRED()));
      533 +                            crgetuid(CRED()));
 541  534                          client_data->deleg = GSS_C_NO_CREDENTIAL;
 542  535                  }
 543  536          }
 544  537          mutex_exit(&cb_mutex);
 545  538          return (ret);
 546  539  }
 547  540  
 548  541  /*
 549  542   * Get caller credentials.
 550  543   */
 551  544  bool_t
 552      -rpc_gss_getcred(req, rcred, ucred, cookie)
 553      -        struct svc_req          *req;
 554      -        rpc_gss_rawcred_t       **rcred;
 555      -        rpc_gss_ucred_t         **ucred;
 556      -        void                    **cookie;
      545 +rpc_gss_getcred(struct svc_req *req, rpc_gss_rawcred_t **rcred,
      546 +    rpc_gss_ucred_t **ucred, void **cookie)
 557  547  {
 558  548          SVCAUTH                 *svcauth;
 559  549          svc_rpc_gss_data        *client_data;
 560  550          int                     gssstat, gidlen;
 561  551  
 562  552          svcauth = &req->rq_xprt->xp_auth;
 563  553          client_data = (svc_rpc_gss_data *)svcauth->svc_ah_private;
 564  554  
 565  555          mutex_enter(&client_data->clm);
 566  556  
 567  557          if (rcred != NULL) {
 568  558                  svcauth->raw_cred = client_data->raw_cred;
 569  559                  *rcred = &svcauth->raw_cred;
 570  560          }
 571  561          if (ucred != NULL) {
 572  562                  *ucred = &client_data->u_cred;
 573  563  
 574  564                  if (client_data->u_cred_set == 0 ||
 575  565                      client_data->u_cred_set < gethrestime_sec()) {
 576      -                    if (client_data->u_cred_set == 0) {
 577      -                        if ((gssstat = kgsscred_expname_to_unix_cred(
 578      -                            &client_data->client_name,
 579      -                            &client_data->u_cred.uid,
 580      -                            &client_data->u_cred.gid,
 581      -                            &client_data->u_cred.gidlist,
 582      -                            &gidlen, crgetuid(CRED()))) != GSS_S_COMPLETE) {
 583      -                                RPCGSS_LOG(1, "rpc_gss_getcred: "
 584      -                                    "kgsscred_expname_to_unix_cred failed %x\n",
 585      -                                    gssstat);
 586      -                                *ucred = NULL;
 587      -                        } else {
 588      -                                client_data->u_cred.gidlen = (short)gidlen;
 589      -                                client_data->u_cred_set =
 590      -                                    gethrestime_sec() + svc_rpcgss_gid_timeout;
      566 +                        if (client_data->u_cred_set == 0) {
      567 +                                if ((gssstat = kgsscred_expname_to_unix_cred(
      568 +                                    &client_data->client_name,
      569 +                                    &client_data->u_cred.uid,
      570 +                                    &client_data->u_cred.gid,
      571 +                                    &client_data->u_cred.gidlist,
      572 +                                    &gidlen, crgetuid(CRED())))
      573 +                                    != GSS_S_COMPLETE) {
      574 +                                        RPCGSS_LOG(1, "rpc_gss_getcred: "
      575 +                                            "kgsscred_expname_to_unix_cred "
      576 +                                            "failed %x\n", gssstat);
      577 +                                        *ucred = NULL;
      578 +                                } else {
      579 +                                        client_data->u_cred.gidlen =
      580 +                                            (short)gidlen;
      581 +                                        client_data->u_cred_set =
      582 +                                            gethrestime_sec() +
      583 +                                            svc_rpcgss_gid_timeout;
      584 +                                }
      585 +                        } else if (client_data->u_cred_set
      586 +                            < gethrestime_sec()) {
      587 +                                if ((gssstat = kgss_get_group_info(
      588 +                                    client_data->u_cred.uid,
      589 +                                    &client_data->u_cred.gid,
      590 +                                    &client_data->u_cred.gidlist,
      591 +                                    &gidlen, crgetuid(CRED())))
      592 +                                    != GSS_S_COMPLETE) {
      593 +                                        RPCGSS_LOG(1, "rpc_gss_getcred: "
      594 +                                            "kgss_get_group_info failed %x\n",
      595 +                                            gssstat);
      596 +                                        *ucred = NULL;
      597 +                                } else {
      598 +                                        client_data->u_cred.gidlen =
      599 +                                            (short)gidlen;
      600 +                                        client_data->u_cred_set =
      601 +                                            gethrestime_sec() +
      602 +                                            svc_rpcgss_gid_timeout;
      603 +                                }
 591  604                          }
 592      -                    } else if (client_data->u_cred_set < gethrestime_sec()) {
 593      -                        if ((gssstat = kgss_get_group_info(
 594      -                            client_data->u_cred.uid,
 595      -                            &client_data->u_cred.gid,
 596      -                            &client_data->u_cred.gidlist,
 597      -                            &gidlen, crgetuid(CRED()))) != GSS_S_COMPLETE) {
 598      -                                RPCGSS_LOG(1, "rpc_gss_getcred: "
 599      -                                    "kgss_get_group_info failed %x\n",
 600      -                                    gssstat);
 601      -                                *ucred = NULL;
 602      -                        } else {
 603      -                                client_data->u_cred.gidlen = (short)gidlen;
 604      -                                client_data->u_cred_set =
 605      -                                    gethrestime_sec() + svc_rpcgss_gid_timeout;
 606      -                        }
 607      -                    }
 608  605                  }
 609  606          }
 610  607  
 611  608          if (cookie != NULL)
 612  609                  *cookie = client_data->cookie;
 613  610          req->rq_xprt->xp_cookie = client_data->cookie;
 614  611  
 615  612          mutex_exit(&client_data->clm);
 616  613  
 617  614          return (TRUE);
↓ open down ↓ 69 lines elided ↑ open up ↑
 687  684          rpc_gss_init_arg *call_arg,
 688  685          struct rpc_msg *msg,
 689  686          svc_rpc_gss_data *client_data,
 690  687          uint_t cr_version,
 691  688          rpc_gss_service_t cr_service)
 692  689  {
 693  690          rpc_gss_init_res        call_res;
 694  691          gss_buffer_desc         output_token;
 695  692          OM_uint32               gssstat, minor, minor_stat, time_rec;
 696  693          int                     ret_flags, ret;
 697      -        gss_OID                 mech_type = GSS_C_NULL_OID;
      694 +        gss_OID                 mech_type = GSS_C_NULL_OID;
 698  695          int                     free_mech_type = 1;
 699  696          struct svc_req          r, *rqst;
 700  697  
 701  698          rqst = &r;
 702  699          rqst->rq_xprt = xprt;
 703  700  
 704  701          /*
 705  702           * Initialize output_token.
 706  703           */
 707  704          output_token.length = 0;
↓ open down ↓ 194 lines elided ↑ open up ↑
 902  899          svcrpcsec_gss_taskq_arg_t *arg = svcrpcsecgss_taskq_arg;
 903  900  
 904  901          retval = do_gss_accept(arg->rq_xprt, arg->rpc_call_arg, arg->msg,
 905  902              arg->client_data, arg->cr_version, arg->cr_service);
 906  903          if (retval != AUTH_OK) {
 907  904                  cmn_err(CE_NOTE,
 908  905                      "svcrpcsec_gss_taskq_func:  do_gss_accept fail 0x%x",
 909  906                      retval);
 910  907          }
 911  908          rpc_msg_free(&arg->msg, MAX_AUTH_BYTES);
      909 +        SVC_RELE(arg->rq_xprt, NULL, FALSE);
 912  910          svc_clone_unlink(arg->rq_xprt);
 913  911          svc_clone_free(arg->rq_xprt);
 914  912          xdr_free(__xdr_rpc_gss_init_arg, (caddr_t)arg->rpc_call_arg);
 915  913          kmem_free(arg->rpc_call_arg, sizeof (*arg->rpc_call_arg));
 916  914  
 917  915          kmem_free(arg, sizeof (*arg));
 918  916  }
 919  917  
 920  918  static enum auth_stat
 921  919  rpcsec_gss_init(
↓ open down ↓ 45 lines elided ↑ open up ↑
 967  965                  ret = RPCSEC_GSS_FAILED;
 968  966                  client_data->stale = TRUE;
 969  967                  goto error2;
 970  968          }
 971  969  
 972  970          /* get a xprt clone for taskq thread, taskq func must free it */
 973  971          arg->rq_xprt = svc_clone_init();
 974  972          svc_clone_link(rqst->rq_xprt->xp_master, arg->rq_xprt, rqst->rq_xprt);
 975  973          arg->rq_xprt->xp_xid = rqst->rq_xprt->xp_xid;
 976  974  
      975 +        /*
      976 +         * Increment the reference count on the rpcmod slot so that is not
      977 +         * freed before the task has finished.
      978 +         */
      979 +        SVC_HOLD(arg->rq_xprt);
 977  980  
 978  981          /* set the appropriate wrap/unwrap routine for RPCSEC_GSS */
 979  982          arg->rq_xprt->xp_auth.svc_ah_ops = svc_rpc_gss_ops;
 980  983          arg->rq_xprt->xp_auth.svc_ah_private = (caddr_t)client_data;
 981  984  
 982  985          /* get a dup of rpc msg for taskq thread */
 983  986          arg->msg = rpc_msg_dup(msg);  /* taskq func must free msg dup */
 984  987  
 985  988          arg->client_data = client_data;
 986  989          arg->cr_version = creds.version;
 987  990          arg->cr_service = creds.service;
 988  991  
 989  992          /* should be ok to hold clm lock as taskq will have new thread(s) */
 990  993          ret = ddi_taskq_dispatch(svcrpcsec_gss_init_taskq,
 991  994              svcrpcsec_gss_taskq_func, arg, DDI_SLEEP);
 992  995          if (ret == DDI_FAILURE) {
 993  996                  cmn_err(CE_NOTE, "rpcsec_gss_init: taskq dispatch fail");
 994  997                  ret = RPCSEC_GSS_FAILED;
 995  998                  rpc_msg_free(&arg->msg, MAX_AUTH_BYTES);
      999 +                SVC_RELE(arg->rq_xprt, NULL, FALSE);
 996 1000                  svc_clone_unlink(arg->rq_xprt);
 997 1001                  svc_clone_free(arg->rq_xprt);
 998 1002                  kmem_free(arg, sizeof (*arg));
 999 1003                  goto error2;
1000 1004          }
1001 1005  
1002 1006          mutex_exit(&client_data->clm);
1003 1007          *no_dispatch = TRUE;
1004 1008          return (AUTH_OK);
1005 1009  
↓ open down ↓ 460 lines elided ↑ open up ↑
1466 1470          }
1467 1471          return (TRUE);
1468 1472  }
1469 1473  
1470 1474  
1471 1475  /*
1472 1476   * Set response verifier.  This is the checksum of the given number.
1473 1477   * (e.g. sequence number or sequence window)
1474 1478   */
1475 1479  static bool_t
1476      -set_response_verf(rqst, msg, cl, num)
1477      -        struct svc_req          *rqst;
1478      -        struct rpc_msg          *msg;
1479      -        svc_rpc_gss_data        *cl;
1480      -        uint_t                  num;
     1480 +set_response_verf(struct svc_req *rqst, struct rpc_msg *msg,
     1481 +    svc_rpc_gss_data *cl, uint_t num)
1481 1482  {
1482 1483          OM_uint32               minor;
1483 1484          gss_buffer_desc         in_buf, out_buf;
1484 1485          uint_t                  num_net;
1485 1486  
1486 1487          num_net = (uint_t)htonl(num);
1487 1488          in_buf.length = sizeof (num);
1488 1489          in_buf.value = (char *)&num_net;
1489 1490  /* XXX uid ? */
1490 1491  
1491      -        if ((kgss_sign(&minor, cl->context, cl->qop, &in_buf,
1492      -                                &out_buf)) != GSS_S_COMPLETE)
     1492 +        if ((kgss_sign(&minor, cl->context, cl->qop, &in_buf, &out_buf))
     1493 +            != GSS_S_COMPLETE)
1493 1494                  return (FALSE);
1494 1495  
1495 1496          rqst->rq_xprt->xp_verf.oa_flavor = RPCSEC_GSS;
1496 1497          rqst->rq_xprt->xp_verf.oa_base = msg->rm_call.cb_verf.oa_base;
1497 1498          rqst->rq_xprt->xp_verf.oa_length = out_buf.length;
1498 1499          bcopy(out_buf.value, rqst->rq_xprt->xp_verf.oa_base, out_buf.length);
1499 1500          (void) gss_release_buffer(&minor, &out_buf);
1500 1501          return (TRUE);
1501 1502  }
1502 1503  
↓ open down ↓ 54 lines elided ↑ open up ↑
1557 1558                          return (client_data);
1558 1559                  }
1559 1560          }
1560 1561          /*NOTREACHED*/
1561 1562  }
1562 1563  
1563 1564  /*
1564 1565   * Insert client context into hash list and LRU list.
1565 1566   */
1566 1567  static void
1567      -insert_client(client_data)
1568      -        svc_rpc_gss_data        *client_data;
     1568 +insert_client(svc_rpc_gss_data *client_data)
1569 1569  {
1570 1570          svc_rpc_gss_data        *cl;
1571 1571          int                     index = HASH(client_data->key);
1572 1572  
1573 1573          ASSERT(mutex_owned(&ctx_mutex));
1574 1574  
1575 1575          client_data->prev = NULL;
1576 1576          cl = clients[index];
1577 1577          if ((client_data->next = cl) != NULL)
1578 1578                  cl->prev = client_data;
↓ open down ↓ 7 lines elided ↑ open up ↑
1586 1586          lru_first = client_data;
1587 1587  
1588 1588          num_gss_contexts++;
1589 1589  }
1590 1590  
1591 1591  /*
1592 1592   * Fetch a client, given the client context handle.  Move it to the
1593 1593   * top of the LRU list since this is the most recently used context.
1594 1594   */
1595 1595  static svc_rpc_gss_data *
1596      -get_client(ctx_handle)
1597      -        gss_buffer_t            ctx_handle;
     1596 +get_client(gss_buffer_t ctx_handle)
1598 1597  {
1599 1598          uint_t                  key = *(uint_t *)ctx_handle->value;
1600 1599          svc_rpc_gss_data        *cl;
1601 1600  
1602 1601          mutex_enter(&ctx_mutex);
1603 1602          if ((cl = find_client(key)) != NULL) {
1604 1603                  mutex_enter(&cl->clm);
1605 1604                  if (cl->stale) {
1606 1605                          if (cl->ref_cnt == 0) {
1607 1606                                  mutex_exit(&cl->clm);
↓ open down ↓ 21 lines elided ↑ open up ↑
1629 1628          }
1630 1629          mutex_exit(&ctx_mutex);
1631 1630          return (cl);
1632 1631  }
1633 1632  
1634 1633  /*
1635 1634   * Given the client context handle, find the context corresponding to it.
1636 1635   * Don't change its LRU state since it may not be used.
1637 1636   */
1638 1637  static svc_rpc_gss_data *
1639      -find_client(key)
1640      -        uint_t                  key;
     1638 +find_client(uint_t key)
1641 1639  {
1642 1640          int                     index = HASH(key);
1643 1641          svc_rpc_gss_data        *cl = NULL;
1644 1642  
1645 1643          ASSERT(mutex_owned(&ctx_mutex));
1646 1644  
1647 1645          for (cl = clients[index]; cl != NULL; cl = cl->next) {
1648 1646                  if (cl->key == key)
1649 1647                          break;
1650 1648          }
1651 1649          return (cl);
1652 1650  }
1653 1651  
1654 1652  /*
1655 1653   * Destroy a client context.
1656 1654   */
1657 1655  static void
1658      -destroy_client(client_data)
1659      -        svc_rpc_gss_data        *client_data;
     1656 +destroy_client(svc_rpc_gss_data *client_data)
1660 1657  {
1661 1658          OM_uint32               minor;
1662 1659          int                     index = HASH(client_data->key);
1663 1660  
1664 1661          ASSERT(mutex_owned(&ctx_mutex));
1665 1662  
1666 1663          /*
1667 1664           * remove from hash list
1668 1665           */
1669 1666          if (client_data->prev == NULL)
↓ open down ↓ 13 lines elided ↑ open up ↑
1683 1680          if (client_data->lru_next != NULL)
1684 1681                  client_data->lru_next->lru_prev = client_data->lru_prev;
1685 1682          else
1686 1683                  lru_last = client_data->lru_prev;
1687 1684  
1688 1685          /*
1689 1686           * If there is a GSS context, clean up GSS state.
1690 1687           */
1691 1688          if (client_data->context != GSS_C_NO_CONTEXT) {
1692 1689                  (void) kgss_delete_sec_context(&minor, &client_data->context,
1693      -                                        NULL);
     1690 +                    NULL);
1694 1691  
1695 1692                  common_client_data_free(client_data);
1696 1693  
1697 1694                  if (client_data->deleg != GSS_C_NO_CREDENTIAL) {
1698      -                    (void) kgss_release_cred(&minor, &client_data->deleg,
1699      -                                crgetuid(CRED()));
     1695 +                        (void) kgss_release_cred(&minor, &client_data->deleg,
     1696 +                            crgetuid(CRED()));
1700 1697                  }
1701 1698          }
1702 1699  
1703 1700          if (client_data->u_cred.gidlist != NULL) {
1704      -            kmem_free((char *)client_data->u_cred.gidlist,
1705      -                        client_data->u_cred.gidlen * sizeof (gid_t));
1706      -            client_data->u_cred.gidlist = NULL;
     1701 +                kmem_free((char *)client_data->u_cred.gidlist,
     1702 +                    client_data->u_cred.gidlen * sizeof (gid_t));
     1703 +                client_data->u_cred.gidlist = NULL;
1707 1704          }
1708 1705          if (client_data->retrans_data != NULL)
1709 1706                  retrans_del(client_data);
1710 1707  
1711 1708          kmem_cache_free(svc_data_handle, client_data);
1712 1709          num_gss_contexts--;
1713 1710  }
1714 1711  
1715 1712  /*
1716 1713   * Check for expired and stale client contexts.
↓ open down ↓ 49 lines elided ↑ open up ↑
1766 1763          }
1767 1764  
1768 1765          last_swept = gethrestime_sec();
1769 1766  }
1770 1767  
1771 1768  /*
1772 1769   * Encrypt the serialized arguments from xdr_func applied to xdr_ptr
1773 1770   * and write the result to xdrs.
1774 1771   */
1775 1772  static bool_t
1776      -svc_rpc_gss_wrap(auth, out_xdrs, xdr_func, xdr_ptr)
1777      -        SVCAUTH                 *auth;
1778      -        XDR                     *out_xdrs;
1779      -        bool_t                  (*xdr_func)();
1780      -        caddr_t                 xdr_ptr;
     1773 +svc_rpc_gss_wrap(SVCAUTH *auth, XDR *out_xdrs, bool_t (*xdr_func)(),
     1774 +    caddr_t xdr_ptr)
1781 1775  {
1782 1776          svc_rpc_gss_parms_t     *gss_parms = SVCAUTH_GSSPARMS(auth);
1783 1777          bool_t ret;
1784 1778  
1785 1779          /*
1786 1780           * If context is not established, or if neither integrity nor
1787 1781           * privacy service is used, don't wrap - just XDR encode.
1788 1782           * Otherwise, wrap data using service and QOP parameters.
1789 1783           */
1790      -        if (!gss_parms->established ||
1791      -                                gss_parms->service == rpc_gss_svc_none)
     1784 +        if (!gss_parms->established || gss_parms->service == rpc_gss_svc_none)
1792 1785                  return ((*xdr_func)(out_xdrs, xdr_ptr));
1793 1786  
1794 1787          ret = __rpc_gss_wrap_data(gss_parms->service,
1795      -                                (OM_uint32)gss_parms->qop_rcvd,
1796      -                                (gss_ctx_id_t)gss_parms->context,
1797      -                                gss_parms->seq_num,
1798      -                                out_xdrs, xdr_func, xdr_ptr);
     1788 +            (OM_uint32)gss_parms->qop_rcvd,
     1789 +            (gss_ctx_id_t)gss_parms->context,
     1790 +            gss_parms->seq_num,
     1791 +            out_xdrs, xdr_func, xdr_ptr);
1799 1792          return (ret);
1800 1793  }
1801 1794  
1802 1795  /*
1803 1796   * Decrypt the serialized arguments and XDR decode them.
1804 1797   */
1805 1798  static bool_t
1806      -svc_rpc_gss_unwrap(auth, in_xdrs, xdr_func, xdr_ptr)
1807      -        SVCAUTH                 *auth;
1808      -        XDR                     *in_xdrs;
1809      -        bool_t                  (*xdr_func)();
1810      -        caddr_t                 xdr_ptr;
     1799 +svc_rpc_gss_unwrap(SVCAUTH *auth, XDR *in_xdrs, bool_t (*xdr_func)(),
     1800 +    caddr_t xdr_ptr)
1811 1801  {
1812 1802          svc_rpc_gss_parms_t     *gss_parms = SVCAUTH_GSSPARMS(auth);
1813 1803  
1814 1804          /*
1815 1805           * If context is not established, or if neither integrity nor
1816 1806           * privacy service is used, don't unwrap - just XDR decode.
1817 1807           * Otherwise, unwrap data.
1818 1808           */
1819      -        if (!gss_parms->established ||
1820      -                                gss_parms->service == rpc_gss_svc_none)
     1809 +        if (!gss_parms->established || gss_parms->service == rpc_gss_svc_none)
1821 1810                  return ((*xdr_func)(in_xdrs, xdr_ptr));
1822 1811  
1823 1812          return (__rpc_gss_unwrap_data(gss_parms->service,
1824      -                                (gss_ctx_id_t)gss_parms->context,
1825      -                                gss_parms->seq_num,
1826      -                                gss_parms->qop_rcvd,
1827      -                                in_xdrs, xdr_func, xdr_ptr));
     1813 +            (gss_ctx_id_t)gss_parms->context,
     1814 +            gss_parms->seq_num,
     1815 +            gss_parms->qop_rcvd,
     1816 +            in_xdrs, xdr_func, xdr_ptr));
1828 1817  }
1829 1818  
1830 1819  
1831 1820  /* ARGSUSED */
1832 1821  int
1833 1822  rpc_gss_svc_max_data_length(struct svc_req *req, int max_tp_unit_len)
1834 1823  {
1835 1824          return (0);
1836 1825  }
1837 1826  
↓ open down ↓ 85 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX