Line data Source code
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 :
33 : #include "mech_locl.h"
34 :
35 : GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
36 222875 : gss_create_empty_buffer_set
37 : (OM_uint32 * minor_status,
38 : gss_buffer_set_t *buffer_set)
39 : {
40 : gss_buffer_set_t set;
41 :
42 222875 : set = (gss_buffer_set_desc *) malloc(sizeof(*set));
43 222875 : if (set == GSS_C_NO_BUFFER_SET) {
44 0 : *minor_status = ENOMEM;
45 0 : return GSS_S_FAILURE;
46 : }
47 :
48 222875 : set->count = 0;
49 222875 : set->elements = NULL;
50 :
51 222875 : *buffer_set = set;
52 :
53 222875 : *minor_status = 0;
54 222875 : return GSS_S_COMPLETE;
55 : }
56 :
57 : GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
58 222875 : gss_add_buffer_set_member
59 : (OM_uint32 * minor_status,
60 : const gss_buffer_t member_buffer,
61 : gss_buffer_set_t *buffer_set)
62 : {
63 : gss_buffer_set_t set;
64 : gss_buffer_t p;
65 : OM_uint32 ret;
66 :
67 222875 : if (*buffer_set == GSS_C_NO_BUFFER_SET) {
68 222875 : ret = gss_create_empty_buffer_set(minor_status,
69 : buffer_set);
70 222875 : if (ret) {
71 0 : return ret;
72 : }
73 : }
74 :
75 222875 : set = *buffer_set;
76 222875 : set->elements = realloc(set->elements,
77 222875 : (set->count + 1) * sizeof(set->elements[0]));
78 222875 : if (set->elements == NULL) {
79 0 : *minor_status = ENOMEM;
80 0 : return GSS_S_FAILURE;
81 : }
82 :
83 222875 : p = &set->elements[set->count];
84 :
85 222875 : p->value = malloc(member_buffer->length);
86 222875 : if (p->value == NULL) {
87 0 : *minor_status = ENOMEM;
88 0 : return GSS_S_FAILURE;
89 : }
90 222875 : memcpy(p->value, member_buffer->value, member_buffer->length);
91 222875 : p->length = member_buffer->length;
92 :
93 222875 : set->count++;
94 :
95 222875 : *minor_status = 0;
96 222875 : return GSS_S_COMPLETE;
97 : }
98 :
99 : GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
100 287999 : gss_release_buffer_set(OM_uint32 * minor_status,
101 : gss_buffer_set_t *buffer_set)
102 : {
103 : size_t i;
104 : OM_uint32 minor;
105 :
106 287999 : *minor_status = 0;
107 :
108 287999 : if (*buffer_set == GSS_C_NO_BUFFER_SET)
109 65124 : return GSS_S_COMPLETE;
110 :
111 381532 : for (i = 0; i < (*buffer_set)->count; i++)
112 158657 : gss_release_buffer(&minor, &((*buffer_set)->elements[i]));
113 :
114 222875 : free((*buffer_set)->elements);
115 :
116 222875 : (*buffer_set)->elements = NULL;
117 222875 : (*buffer_set)->count = 0;
118 :
119 222875 : free(*buffer_set);
120 222875 : *buffer_set = GSS_C_NO_BUFFER_SET;
121 :
122 222875 : return GSS_S_COMPLETE;
123 : }
124 :
|