#include "mech_locl.h"
GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
gss_create_empty_buffer_set
(OM_uint32 * minor_status,
gss_buffer_set_t *buffer_set)
{
gss_buffer_set_t set;
set = (gss_buffer_set_desc *) malloc(sizeof(*set));
if (set == GSS_C_NO_BUFFER_SET) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
set->count = 0;
set->elements = NULL;
*buffer_set = set;
*minor_status = 0;
return GSS_S_COMPLETE;
}
GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
gss_add_buffer_set_member
(OM_uint32 * minor_status,
const gss_buffer_t member_buffer,
gss_buffer_set_t *buffer_set)
{
gss_buffer_set_t set;
gss_buffer_t p;
OM_uint32 ret;
if (*buffer_set == GSS_C_NO_BUFFER_SET) {
ret = gss_create_empty_buffer_set(minor_status,
buffer_set);
if (ret) {
return ret;
}
}
set = *buffer_set;
set->elements = realloc(set->elements,
(set->count + 1) * sizeof(set->elements[0]));
if (set->elements == NULL) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
p = &set->elements[set->count];
p->value = malloc(member_buffer->length);
if (p->value == NULL) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
memcpy(p->value, member_buffer->value, member_buffer->length);
p->length = member_buffer->length;
set->count++;
*minor_status = 0;
return GSS_S_COMPLETE;
}
GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
gss_release_buffer_set(OM_uint32 * minor_status,
gss_buffer_set_t *buffer_set)
{
size_t i;
OM_uint32 minor;
*minor_status = 0;
if (*buffer_set == GSS_C_NO_BUFFER_SET)
return GSS_S_COMPLETE;
for (i = 0; i < (*buffer_set)->count; i++)
gss_release_buffer(&minor, &((*buffer_set)->elements[i]));
free((*buffer_set)->elements);
(*buffer_set)->elements = NULL;
(*buffer_set)->count = 0;
free(*buffer_set);
*buffer_set = GSS_C_NO_BUFFER_SET;
return GSS_S_COMPLETE;
}