The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kgssapi/gssd_prot.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
    3  *
    4  * Copyright (c) 2008 Isilon Inc http://www.isilon.com/
    5  * Authors: Doug Rabson <dfr@rabson.org>
    6  * Developed with Red Inc: Alfred Perlstein <alfred@freebsd.org>
    7  *
    8  * Redistribution and use in source and binary forms, with or without
    9  * modification, are permitted provided that the following conditions
   10  * are met:
   11  * 1. Redistributions of source code must retain the above copyright
   12  *    notice, this list of conditions and the following disclaimer.
   13  * 2. Redistributions in binary form must reproduce the above copyright
   14  *    notice, this list of conditions and the following disclaimer in the
   15  *    documentation and/or other materials provided with the distribution.
   16  *
   17  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   27  * SUCH DAMAGE.
   28  */
   29 
   30 #include <sys/cdefs.h>
   31 __FBSDID("$FreeBSD$");
   32 
   33 #ifdef _KERNEL
   34 #include <sys/malloc.h>
   35 #else
   36 #include <stdlib.h>
   37 #include <string.h>
   38 #endif
   39 
   40 #include <rpc/rpc.h>
   41 #include <rpc/rpc_com.h>
   42 
   43 #include "gssd.h"
   44 
   45 bool_t
   46 xdr_gss_buffer_desc(XDR *xdrs, gss_buffer_desc *buf)
   47 {
   48         char *val;
   49         u_int len;
   50 
   51         len = buf->length;
   52         val = buf->value;
   53         if (!xdr_bytes(xdrs, &val, &len, ~0))
   54                 return (FALSE);
   55         buf->length = len;
   56         buf->value = val;
   57 
   58         return (TRUE);
   59 }
   60 
   61 bool_t
   62 xdr_gss_OID_desc(XDR *xdrs, gss_OID_desc *oid)
   63 {
   64         char *val;
   65         u_int len;
   66 
   67         len = oid->length;
   68         val = oid->elements;
   69         if (!xdr_bytes(xdrs, &val, &len, ~0))
   70                 return (FALSE);
   71         oid->length = len;
   72         oid->elements = val;
   73 
   74         return (TRUE);
   75 }
   76 
   77 bool_t
   78 xdr_gss_OID(XDR *xdrs, gss_OID *oidp)
   79 {
   80         gss_OID oid;
   81         bool_t is_null;
   82 
   83         switch (xdrs->x_op) {
   84         case XDR_ENCODE:
   85                 oid = *oidp;
   86                 if (oid) {
   87                         is_null = FALSE;
   88                         if (!xdr_bool(xdrs, &is_null)
   89                             || !xdr_gss_OID_desc(xdrs, oid))
   90                                 return (FALSE);
   91                 } else {
   92                         is_null = TRUE;
   93                         if (!xdr_bool(xdrs, &is_null))
   94                                 return (FALSE);
   95                 }
   96                 break;
   97 
   98         case XDR_DECODE:
   99                 if (!xdr_bool(xdrs, &is_null))
  100                         return (FALSE);
  101                 if (is_null) {
  102                         *oidp = GSS_C_NO_OID;
  103                 } else {
  104                         oid = mem_alloc(sizeof(gss_OID_desc));
  105                         memset(oid, 0, sizeof(*oid));
  106                         if (!xdr_gss_OID_desc(xdrs, oid)) {
  107                                 mem_free(oid, sizeof(gss_OID_desc));
  108                                 return (FALSE);
  109                         }
  110                         *oidp = oid;
  111                 }
  112                 break;
  113 
  114         case XDR_FREE:
  115                 oid = *oidp;
  116                 if (oid) {
  117                         xdr_gss_OID_desc(xdrs, oid);
  118                         mem_free(oid, sizeof(gss_OID_desc));
  119                 }
  120         }
  121 
  122         return (TRUE);
  123 }
  124 
  125 bool_t
  126 xdr_gss_OID_set_desc(XDR *xdrs, gss_OID_set_desc *set)
  127 {
  128         caddr_t addr;
  129         u_int len;
  130 
  131         len = set->count;
  132         addr = (caddr_t) set->elements;
  133         if (!xdr_array(xdrs, &addr, &len, ~0, sizeof(gss_OID_desc),
  134                 (xdrproc_t) xdr_gss_OID_desc))
  135                 return (FALSE);
  136         set->count = len;
  137         set->elements = (gss_OID) addr;
  138 
  139         return (TRUE);
  140 }
  141 
  142 bool_t
  143 xdr_gss_OID_set(XDR *xdrs, gss_OID_set *setp)
  144 {
  145         gss_OID_set set;
  146         bool_t is_null;
  147 
  148         switch (xdrs->x_op) {
  149         case XDR_ENCODE:
  150                 set = *setp;
  151                 if (set) {
  152                         is_null = FALSE;
  153                         if (!xdr_bool(xdrs, &is_null)
  154                             || !xdr_gss_OID_set_desc(xdrs, set))
  155                                 return (FALSE);
  156                 } else {
  157                         is_null = TRUE;
  158                         if (!xdr_bool(xdrs, &is_null))
  159                                 return (FALSE);
  160                 }
  161                 break;
  162 
  163         case XDR_DECODE:
  164                 if (!xdr_bool(xdrs, &is_null))
  165                         return (FALSE);
  166                 if (is_null) {
  167                         *setp = GSS_C_NO_OID_SET;
  168                 } else {
  169                         set = mem_alloc(sizeof(gss_OID_set_desc));
  170                         memset(set, 0, sizeof(*set));
  171                         if (!xdr_gss_OID_set_desc(xdrs, set)) {
  172                                 mem_free(set, sizeof(gss_OID_set_desc));
  173                                 return (FALSE);
  174                         }
  175                         *setp = set;
  176                 }
  177                 break;
  178 
  179         case XDR_FREE:
  180                 set = *setp;
  181                 if (set) {
  182                         xdr_gss_OID_set_desc(xdrs, set);
  183                         mem_free(set, sizeof(gss_OID_set_desc));
  184                 }
  185         }
  186 
  187         return (TRUE);
  188 }
  189 
  190 bool_t
  191 xdr_gss_channel_bindings_t(XDR *xdrs, gss_channel_bindings_t *chp)
  192 {
  193         gss_channel_bindings_t ch;
  194         bool_t is_null;
  195 
  196         switch (xdrs->x_op) {
  197         case XDR_ENCODE:
  198                 ch = *chp;
  199                 if (ch) {
  200                         is_null = FALSE;
  201                         if (!xdr_bool(xdrs, &is_null)
  202                             || !xdr_uint32_t(xdrs, &ch->initiator_addrtype)
  203                             || !xdr_gss_buffer_desc(xdrs,
  204                                 &ch->initiator_address)
  205                             || !xdr_uint32_t(xdrs, &ch->acceptor_addrtype)
  206                             || !xdr_gss_buffer_desc(xdrs,
  207                                 &ch->acceptor_address)
  208                             || !xdr_gss_buffer_desc(xdrs,
  209                                 &ch->application_data))
  210                                 return (FALSE);
  211                 } else {
  212                         is_null = TRUE;
  213                         if (!xdr_bool(xdrs, &is_null))
  214                                 return (FALSE);
  215                 }
  216                 break;
  217 
  218         case XDR_DECODE:
  219                 if (!xdr_bool(xdrs, &is_null))
  220                         return (FALSE);
  221                 if (is_null) {
  222                         *chp = GSS_C_NO_CHANNEL_BINDINGS;
  223                 } else {
  224                         ch = mem_alloc(sizeof(*ch));
  225                         memset(ch, 0, sizeof(*ch));
  226                         if (!xdr_uint32_t(xdrs, &ch->initiator_addrtype)
  227                             || !xdr_gss_buffer_desc(xdrs,
  228                                 &ch->initiator_address)
  229                             || !xdr_uint32_t(xdrs, &ch->acceptor_addrtype)
  230                             || !xdr_gss_buffer_desc(xdrs,
  231                                 &ch->acceptor_address)
  232                             || !xdr_gss_buffer_desc(xdrs,
  233                                 &ch->application_data)) {
  234                                 mem_free(ch, sizeof(*ch));
  235                                 return (FALSE);
  236                         }
  237                         *chp = ch;
  238                 }
  239                 break;
  240 
  241         case XDR_FREE:
  242                 ch = *chp;
  243                 if (ch) {
  244                         xdr_gss_buffer_desc(xdrs, &ch->initiator_address);
  245                         xdr_gss_buffer_desc(xdrs, &ch->acceptor_address);
  246                         xdr_gss_buffer_desc(xdrs, &ch->application_data);
  247                         mem_free(ch, sizeof(*ch));
  248                 }
  249         }
  250 
  251         return (TRUE);
  252 }

Cache object: 29ce92a25644ea8fdb80b123ee4cba68


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.