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