]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - lib/libgssapi/gss_buffer_set.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / lib / libgssapi / gss_buffer_set.c
1 /*
2  * Copyright (c) 2004, PADL Software Pty Ltd.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * 3. Neither the name of PADL Software nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 /* $FreeBSD$ */
33
34 #include <gssapi/gssapi.h>
35 #include <errno.h>
36 #include <stdlib.h>
37 #include <string.h>
38
39 /* RCSID("$Id: gss_buffer_set.c 18885 2006-10-24 21:53:02Z lha $"); */
40
41 OM_uint32 
42 gss_create_empty_buffer_set(OM_uint32 * minor_status,
43     gss_buffer_set_t *buffer_set)
44 {
45         gss_buffer_set_t set;
46
47         set = (gss_buffer_set_desc *) malloc(sizeof(*set));
48         if (set == GSS_C_NO_BUFFER_SET) {
49                 *minor_status = ENOMEM;
50                 return (GSS_S_FAILURE);
51         }
52
53         set->count = 0;
54         set->elements = NULL;
55
56         *buffer_set = set;
57
58         *minor_status = 0;
59         return (GSS_S_COMPLETE);
60 }
61
62 OM_uint32
63 gss_add_buffer_set_member(OM_uint32 * minor_status,
64     const gss_buffer_t member_buffer, gss_buffer_set_t *buffer_set)
65 {
66         gss_buffer_set_t set;
67         gss_buffer_t p;
68         OM_uint32 ret;
69
70         if (*buffer_set == GSS_C_NO_BUFFER_SET) {
71                 ret = gss_create_empty_buffer_set(minor_status,
72                     buffer_set);
73                 if (ret) {
74                         return (ret);
75                 }
76         }
77
78         set = *buffer_set;
79         set->elements = realloc(set->elements,
80             (set->count + 1) * sizeof(set->elements[0]));
81         if (set->elements == NULL) {
82                 *minor_status = ENOMEM;
83                 return (GSS_S_FAILURE);
84         }
85
86         p = &set->elements[set->count];
87
88         p->value = malloc(member_buffer->length);
89         if (p->value == NULL) {
90                 *minor_status = ENOMEM;
91                 return (GSS_S_FAILURE);
92         }
93         memcpy(p->value, member_buffer->value, member_buffer->length);
94         p->length = member_buffer->length;
95
96         set->count++;
97
98         *minor_status = 0;
99         return (GSS_S_COMPLETE);
100 }
101
102 OM_uint32
103 gss_release_buffer_set(OM_uint32 * minor_status, gss_buffer_set_t *buffer_set)
104 {
105         size_t i;
106         OM_uint32 minor;
107
108         *minor_status = 0;
109
110         if (*buffer_set == GSS_C_NO_BUFFER_SET)
111                 return (GSS_S_COMPLETE);
112
113         for (i = 0; i < (*buffer_set)->count; i++)
114                 gss_release_buffer(&minor, &((*buffer_set)->elements[i]));
115
116         free((*buffer_set)->elements);
117
118         (*buffer_set)->elements = NULL;
119         (*buffer_set)->count = 0;
120
121         free(*buffer_set);
122         *buffer_set = GSS_C_NO_BUFFER_SET;
123
124         return (GSS_S_COMPLETE);
125 }
126