xref: /freebsd/lib/libgssapi/gss_buffer_set.c (revision 8d20be1e22095c27faf8fe8b2f0d089739cc742e)
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 
127