1*8a16b7a1SPedro F. Giffuni /*-
2*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
3*8a16b7a1SPedro F. Giffuni *
433f12199SDoug Rabson * Copyright (c) 2004, PADL Software Pty Ltd.
533f12199SDoug Rabson * All rights reserved.
633f12199SDoug Rabson *
733f12199SDoug Rabson * Redistribution and use in source and binary forms, with or without
833f12199SDoug Rabson * modification, are permitted provided that the following conditions
933f12199SDoug Rabson * are met:
1033f12199SDoug Rabson *
1133f12199SDoug Rabson * 1. Redistributions of source code must retain the above copyright
1233f12199SDoug Rabson * notice, this list of conditions and the following disclaimer.
1333f12199SDoug Rabson *
1433f12199SDoug Rabson * 2. Redistributions in binary form must reproduce the above copyright
1533f12199SDoug Rabson * notice, this list of conditions and the following disclaimer in the
1633f12199SDoug Rabson * documentation and/or other materials provided with the distribution.
1733f12199SDoug Rabson *
1833f12199SDoug Rabson * 3. Neither the name of PADL Software nor the names of its contributors
1933f12199SDoug Rabson * may be used to endorse or promote products derived from this software
2033f12199SDoug Rabson * without specific prior written permission.
2133f12199SDoug Rabson *
2233f12199SDoug Rabson * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
2333f12199SDoug Rabson * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2433f12199SDoug Rabson * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2533f12199SDoug Rabson * ARE DISCLAIMED. IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
2633f12199SDoug Rabson * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2733f12199SDoug Rabson * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2833f12199SDoug Rabson * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2933f12199SDoug Rabson * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3033f12199SDoug Rabson * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3133f12199SDoug Rabson * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3233f12199SDoug Rabson * SUCH DAMAGE.
3333f12199SDoug Rabson */
3433f12199SDoug Rabson
3533f12199SDoug Rabson #include <gssapi/gssapi.h>
3633f12199SDoug Rabson #include <errno.h>
3733f12199SDoug Rabson #include <stdlib.h>
3833f12199SDoug Rabson #include <string.h>
3933f12199SDoug Rabson
4033f12199SDoug Rabson /* RCSID("$Id: gss_buffer_set.c 18885 2006-10-24 21:53:02Z lha $"); */
4133f12199SDoug Rabson
4233f12199SDoug Rabson OM_uint32
gss_create_empty_buffer_set(OM_uint32 * minor_status,gss_buffer_set_t * buffer_set)4333f12199SDoug Rabson gss_create_empty_buffer_set(OM_uint32 * minor_status,
4433f12199SDoug Rabson gss_buffer_set_t *buffer_set)
4533f12199SDoug Rabson {
4633f12199SDoug Rabson gss_buffer_set_t set;
4733f12199SDoug Rabson
4833f12199SDoug Rabson set = (gss_buffer_set_desc *) malloc(sizeof(*set));
4933f12199SDoug Rabson if (set == GSS_C_NO_BUFFER_SET) {
5033f12199SDoug Rabson *minor_status = ENOMEM;
5133f12199SDoug Rabson return (GSS_S_FAILURE);
5233f12199SDoug Rabson }
5333f12199SDoug Rabson
5433f12199SDoug Rabson set->count = 0;
5533f12199SDoug Rabson set->elements = NULL;
5633f12199SDoug Rabson
5733f12199SDoug Rabson *buffer_set = set;
5833f12199SDoug Rabson
5933f12199SDoug Rabson *minor_status = 0;
6033f12199SDoug Rabson return (GSS_S_COMPLETE);
6133f12199SDoug Rabson }
6233f12199SDoug Rabson
6333f12199SDoug Rabson OM_uint32
gss_add_buffer_set_member(OM_uint32 * minor_status,const gss_buffer_t member_buffer,gss_buffer_set_t * buffer_set)6433f12199SDoug Rabson gss_add_buffer_set_member(OM_uint32 * minor_status,
6533f12199SDoug Rabson const gss_buffer_t member_buffer, gss_buffer_set_t *buffer_set)
6633f12199SDoug Rabson {
6733f12199SDoug Rabson gss_buffer_set_t set;
6833f12199SDoug Rabson gss_buffer_t p;
6933f12199SDoug Rabson OM_uint32 ret;
7033f12199SDoug Rabson
7133f12199SDoug Rabson if (*buffer_set == GSS_C_NO_BUFFER_SET) {
7233f12199SDoug Rabson ret = gss_create_empty_buffer_set(minor_status,
7333f12199SDoug Rabson buffer_set);
7433f12199SDoug Rabson if (ret) {
7533f12199SDoug Rabson return (ret);
7633f12199SDoug Rabson }
7733f12199SDoug Rabson }
7833f12199SDoug Rabson
7933f12199SDoug Rabson set = *buffer_set;
80efa8af7cSPedro F. Giffuni set->elements = reallocarray(set->elements, set->count + 1,
81efa8af7cSPedro F. Giffuni sizeof(set->elements[0]));
8233f12199SDoug Rabson if (set->elements == NULL) {
8333f12199SDoug Rabson *minor_status = ENOMEM;
8433f12199SDoug Rabson return (GSS_S_FAILURE);
8533f12199SDoug Rabson }
8633f12199SDoug Rabson
8733f12199SDoug Rabson p = &set->elements[set->count];
8833f12199SDoug Rabson
8933f12199SDoug Rabson p->value = malloc(member_buffer->length);
9033f12199SDoug Rabson if (p->value == NULL) {
9133f12199SDoug Rabson *minor_status = ENOMEM;
9233f12199SDoug Rabson return (GSS_S_FAILURE);
9333f12199SDoug Rabson }
9433f12199SDoug Rabson memcpy(p->value, member_buffer->value, member_buffer->length);
9533f12199SDoug Rabson p->length = member_buffer->length;
9633f12199SDoug Rabson
9733f12199SDoug Rabson set->count++;
9833f12199SDoug Rabson
9933f12199SDoug Rabson *minor_status = 0;
10033f12199SDoug Rabson return (GSS_S_COMPLETE);
10133f12199SDoug Rabson }
10233f12199SDoug Rabson
10333f12199SDoug Rabson OM_uint32
gss_release_buffer_set(OM_uint32 * minor_status,gss_buffer_set_t * buffer_set)10433f12199SDoug Rabson gss_release_buffer_set(OM_uint32 * minor_status, gss_buffer_set_t *buffer_set)
10533f12199SDoug Rabson {
10633f12199SDoug Rabson size_t i;
10733f12199SDoug Rabson OM_uint32 minor;
10833f12199SDoug Rabson
10933f12199SDoug Rabson *minor_status = 0;
11033f12199SDoug Rabson
11133f12199SDoug Rabson if (*buffer_set == GSS_C_NO_BUFFER_SET)
11233f12199SDoug Rabson return (GSS_S_COMPLETE);
11333f12199SDoug Rabson
11433f12199SDoug Rabson for (i = 0; i < (*buffer_set)->count; i++)
11533f12199SDoug Rabson gss_release_buffer(&minor, &((*buffer_set)->elements[i]));
11633f12199SDoug Rabson
11733f12199SDoug Rabson free((*buffer_set)->elements);
11833f12199SDoug Rabson
11933f12199SDoug Rabson (*buffer_set)->elements = NULL;
12033f12199SDoug Rabson (*buffer_set)->count = 0;
12133f12199SDoug Rabson
12233f12199SDoug Rabson free(*buffer_set);
12333f12199SDoug Rabson *buffer_set = GSS_C_NO_BUFFER_SET;
12433f12199SDoug Rabson
12533f12199SDoug Rabson return (GSS_S_COMPLETE);
12633f12199SDoug Rabson }
12733f12199SDoug Rabson
128