Path: blob/main/crypto/heimdal/lib/gssapi/mech/gss_buffer_set.c
34907 views
/*1* Copyright (c) 2004, PADL Software Pty Ltd.2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7*8* 1. Redistributions of source code must retain the above copyright9* notice, this list of conditions and the following disclaimer.10*11* 2. Redistributions in binary form must reproduce the above copyright12* notice, this list of conditions and the following disclaimer in the13* documentation and/or other materials provided with the distribution.14*15* 3. Neither the name of PADL Software nor the names of its contributors16* may be used to endorse or promote products derived from this software17* without specific prior written permission.18*19* THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND20* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE21* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE22* ARE DISCLAIMED. IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE23* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL24* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS25* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)26* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT27* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY28* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF29* SUCH DAMAGE.30*/3132#include "mech_locl.h"3334GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL35gss_create_empty_buffer_set36(OM_uint32 * minor_status,37gss_buffer_set_t *buffer_set)38{39gss_buffer_set_t set;4041set = (gss_buffer_set_desc *) malloc(sizeof(*set));42if (set == GSS_C_NO_BUFFER_SET) {43*minor_status = ENOMEM;44return GSS_S_FAILURE;45}4647set->count = 0;48set->elements = NULL;4950*buffer_set = set;5152*minor_status = 0;53return GSS_S_COMPLETE;54}5556GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL57gss_add_buffer_set_member58(OM_uint32 * minor_status,59const gss_buffer_t member_buffer,60gss_buffer_set_t *buffer_set)61{62gss_buffer_set_t set;63gss_buffer_t p;64OM_uint32 ret;6566if (*buffer_set == GSS_C_NO_BUFFER_SET) {67ret = gss_create_empty_buffer_set(minor_status,68buffer_set);69if (ret) {70return ret;71}72}7374set = *buffer_set;75set->elements = realloc(set->elements,76(set->count + 1) * sizeof(set->elements[0]));77if (set->elements == NULL) {78*minor_status = ENOMEM;79return GSS_S_FAILURE;80}8182p = &set->elements[set->count];8384p->value = malloc(member_buffer->length);85if (p->value == NULL) {86*minor_status = ENOMEM;87return GSS_S_FAILURE;88}89memcpy(p->value, member_buffer->value, member_buffer->length);90p->length = member_buffer->length;9192set->count++;9394*minor_status = 0;95return GSS_S_COMPLETE;96}9798GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL99gss_release_buffer_set(OM_uint32 * minor_status,100gss_buffer_set_t *buffer_set)101{102size_t i;103OM_uint32 minor;104105*minor_status = 0;106107if (*buffer_set == GSS_C_NO_BUFFER_SET)108return GSS_S_COMPLETE;109110for (i = 0; i < (*buffer_set)->count; i++)111gss_release_buffer(&minor, &((*buffer_set)->elements[i]));112113free((*buffer_set)->elements);114115(*buffer_set)->elements = NULL;116(*buffer_set)->count = 0;117118free(*buffer_set);119*buffer_set = GSS_C_NO_BUFFER_SET;120121return GSS_S_COMPLETE;122}123124125126