|
Packit Service |
9f2c4a |
/* Copyright (C) 2011 the GSS-PROXY contributors, see COPYING for license */
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
#include "config.h"
|
|
Packit Service |
9f2c4a |
#include <string.h>
|
|
Packit Service |
9f2c4a |
#include <stdio.h>
|
|
Packit Service |
9f2c4a |
#include <stdbool.h>
|
|
Packit Service |
9f2c4a |
#include <errno.h>
|
|
Packit Service |
9f2c4a |
#include "gp_conv.h"
|
|
Packit Service |
9f2c4a |
#include "src/gp_common.h"
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
void *gp_memdup(void *in, size_t len)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
void *out;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
out = malloc(len);
|
|
Packit Service |
9f2c4a |
if (!out) {
|
|
Packit Service |
9f2c4a |
return NULL;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
memcpy(out, in, len);
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
return out;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_octet_string(size_t length, void *value, octet_string *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
if (length == 0) {
|
|
Packit Service |
9f2c4a |
out->octet_string_val = NULL;
|
|
Packit Service |
9f2c4a |
out->octet_string_len = 0;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
out->octet_string_val = gp_memdup(value, length);
|
|
Packit Service |
9f2c4a |
if (!out->octet_string_val) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
out->octet_string_len = length;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_octet_string_alloc(size_t length, void *value,
|
|
Packit Service |
9f2c4a |
octet_string **out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
octet_string *o;
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = calloc(1, sizeof(octet_string));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(length, value, o);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
return ret;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
void gp_conv_gssx_to_oid(gssx_OID *in, gss_OID out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
if (in == NULL) {
|
|
Packit Service |
9f2c4a |
out->length = 0;
|
|
Packit Service |
9f2c4a |
out->elements = NULL;
|
|
Packit Service |
9f2c4a |
return;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
out->length = in->octet_string_len;
|
|
Packit Service |
9f2c4a |
out->elements = (void *)in->octet_string_val;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_gssx_to_oid_alloc(gssx_OID *in, gss_OID *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gss_OID o;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in == NULL || in->octet_string_len == 0) {
|
|
Packit Service |
9f2c4a |
*out = GSS_C_NO_OID;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = calloc(1, sizeof(gss_OID_desc));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
o->elements = gp_memdup(in->octet_string_val,
|
|
Packit Service |
9f2c4a |
in->octet_string_len);
|
|
Packit Service |
9f2c4a |
if (!o->elements) {
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
o->length = in->octet_string_len;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_oid_to_gssx(gss_OID in, gssx_OID *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
if (in == GSS_C_NO_OID) {
|
|
Packit Service |
9f2c4a |
return gp_conv_octet_string(0, NULL, out);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
return gp_conv_octet_string(in->length, in->elements, out);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_oid_to_gssx_alloc(gss_OID in, gssx_OID **out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
if (in == GSS_C_NO_OID) {
|
|
Packit Service |
9f2c4a |
*out = NULL;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
return gp_conv_octet_string_alloc(in->length, in->elements, out);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
void gp_conv_gssx_to_buffer(gssx_buffer *in, gss_buffer_t out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
out->length = in->octet_string_len;
|
|
Packit Service |
9f2c4a |
out->value = (void *)in->octet_string_val;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_gssx_to_buffer_alloc(gssx_buffer *in, gss_buffer_t *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gss_buffer_desc *o;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->octet_string_len == 0) {
|
|
Packit Service |
9f2c4a |
*out = GSS_C_NO_BUFFER;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = malloc(sizeof(gss_buffer_desc));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o->value = gp_memdup(in->octet_string_val,
|
|
Packit Service |
9f2c4a |
in->octet_string_len);
|
|
Packit Service |
9f2c4a |
if (!o->value) {
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
o->length = in->octet_string_len;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_copy_gssx_to_buffer(gssx_buffer *in, gss_buffer_t out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gss_buffer_desc empty = GSS_C_EMPTY_BUFFER;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->octet_string_len == 0) {
|
|
Packit Service |
9f2c4a |
*out = empty;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
out->value = gp_memdup(in->octet_string_val,
|
|
Packit Service |
9f2c4a |
in->octet_string_len);
|
|
Packit Service |
9f2c4a |
if (!out->value) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
out->length = in->octet_string_len;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_copy_gssx_to_string_buffer(gssx_buffer *in, gss_buffer_t out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gss_buffer_desc empty = GSS_C_EMPTY_BUFFER;
|
|
Packit Service |
9f2c4a |
char *str;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->octet_string_len == 0) {
|
|
Packit Service |
9f2c4a |
*out = empty;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
str = malloc(in->octet_string_len + 1);
|
|
Packit Service |
9f2c4a |
if (!str) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
memcpy(str, in->octet_string_val, in->octet_string_len);
|
|
Packit Service |
9f2c4a |
str[in->octet_string_len] = '\0';
|
|
Packit Service |
9f2c4a |
out->length = in->octet_string_len;
|
|
Packit Service |
9f2c4a |
out->value = str;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_buffer_to_gssx(gss_buffer_t in, gssx_buffer *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
return gp_conv_octet_string(in->length, in->value, out);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_buffer_to_gssx_alloc(gss_buffer_t in, gssx_buffer **out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
return gp_conv_octet_string_alloc(in->length, in->value, out);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
void gp_conv_gssx_to_cb(gssx_cb *in, gss_channel_bindings_t out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
out->initiator_addrtype = in->initiator_addrtype;
|
|
Packit Service |
9f2c4a |
gp_conv_gssx_to_buffer(&in->initiator_address, &out->initiator_address);
|
|
Packit Service |
9f2c4a |
out->acceptor_addrtype = in->acceptor_addrtype;
|
|
Packit Service |
9f2c4a |
gp_conv_gssx_to_buffer(&in->acceptor_address, &out->acceptor_address);
|
|
Packit Service |
9f2c4a |
gp_conv_gssx_to_buffer(&in->application_data, &out->application_data);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_cb_to_gssx(gss_channel_bindings_t in, gssx_cb *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
out->initiator_addrtype = in->initiator_addrtype;
|
|
Packit Service |
9f2c4a |
ret = gp_conv_buffer_to_gssx(&in->initiator_address,
|
|
Packit Service |
9f2c4a |
&out->initiator_address);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
out->acceptor_addrtype = in->acceptor_addrtype;
|
|
Packit Service |
9f2c4a |
ret = gp_conv_buffer_to_gssx(&in->acceptor_address,
|
|
Packit Service |
9f2c4a |
&out->acceptor_address);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
ret = gp_conv_buffer_to_gssx(&in->application_data,
|
|
Packit Service |
9f2c4a |
&out->application_data);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret = 0;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
done:
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_buffer, (char *)&out->initiator_address);
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_buffer, (char *)&out->acceptor_address);
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_buffer, (char *)&out->application_data);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
return ret;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_cb_to_gssx_alloc(gss_channel_bindings_t in, gssx_cb **out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gssx_cb *o;
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = malloc(sizeof(gssx_cb));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret = gp_conv_cb_to_gssx(in, o);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
gssx_cred_usage gp_conv_cred_usage_to_gssx(gss_cred_usage_t in)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
switch (in) {
|
|
Packit Service |
9f2c4a |
case GSS_C_BOTH:
|
|
Packit Service |
9f2c4a |
return GSSX_C_BOTH;
|
|
Packit Service |
9f2c4a |
case GSS_C_INITIATE:
|
|
Packit Service |
9f2c4a |
return GSSX_C_INITIATE;
|
|
Packit Service |
9f2c4a |
case GSS_C_ACCEPT:
|
|
Packit Service |
9f2c4a |
return GSSX_C_ACCEPT;
|
|
Packit Service |
9f2c4a |
default:
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
gss_cred_usage_t gp_conv_gssx_to_cred_usage(gssx_cred_usage in)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
switch (in) {
|
|
Packit Service |
9f2c4a |
case GSSX_C_BOTH:
|
|
Packit Service |
9f2c4a |
return GSS_C_BOTH;
|
|
Packit Service |
9f2c4a |
case GSSX_C_INITIATE:
|
|
Packit Service |
9f2c4a |
return GSS_C_INITIATE;
|
|
Packit Service |
9f2c4a |
case GSSX_C_ACCEPT:
|
|
Packit Service |
9f2c4a |
return GSS_C_ACCEPT;
|
|
Packit Service |
9f2c4a |
default:
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_err_to_gssx_string(uint32_t status, int type, gss_OID oid,
|
|
Packit Service |
9f2c4a |
utf8string *ret_str)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
uint32_t ret_maj;
|
|
Packit Service |
9f2c4a |
uint32_t ret_min;
|
|
Packit Service |
9f2c4a |
uint32_t msg_ctx;
|
|
Packit Service |
9f2c4a |
gss_buffer_desc gssbuf;
|
|
Packit Service |
9f2c4a |
char *str, *t;
|
|
Packit Service |
9f2c4a |
int ret = 0;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
msg_ctx = 0;
|
|
Packit Service |
9f2c4a |
str = NULL;
|
|
Packit Service |
9f2c4a |
do {
|
|
Packit Service |
9f2c4a |
ret_maj = gss_display_status(&ret_min,
|
|
Packit Service |
9f2c4a |
status, type, oid,
|
|
Packit Service |
9f2c4a |
&msg_ctx, &gssbuf);
|
|
Packit Service |
9f2c4a |
if (ret_maj == GSS_S_COMPLETE) {
|
|
Packit Service |
9f2c4a |
if (str) {
|
|
Packit Service |
9f2c4a |
ret = asprintf(&t, "%s, %s", str, (char *)gssbuf.value);
|
|
Packit Service |
9f2c4a |
if (ret == -1) {
|
|
Packit Service |
9f2c4a |
ret = ENOMEM;
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
free(str);
|
|
Packit Service |
9f2c4a |
str = t;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
str = strdup((char *)gssbuf.value);
|
|
Packit Service |
9f2c4a |
if (!str) {
|
|
Packit Service |
9f2c4a |
ret = ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
gss_release_buffer(&ret_min, &gssbuf);
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
ret = EINVAL;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
} while (msg_ctx);
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_str->utf8string_len = strlen(str) + 1;
|
|
Packit Service |
9f2c4a |
ret_str->utf8string_val = str;
|
|
Packit Service |
9f2c4a |
ret = 0;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
done:
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
free(str);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
return ret;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
uint32_t gp_conv_name_to_gssx(uint32_t *min, gss_name_t in, gssx_name *_out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
uint32_t ret_maj;
|
|
Packit Service |
9f2c4a |
uint32_t ret_min;
|
|
Packit Service |
9f2c4a |
gss_buffer_desc name_buffer = GSS_C_EMPTY_BUFFER;
|
|
Packit Service |
9f2c4a |
gss_OID name_type;
|
|
Packit Service |
9f2c4a |
gss_buffer_desc exported_name = GSS_C_EMPTY_BUFFER;
|
|
Packit Service |
9f2c4a |
gss_buffer_desc exported_composite_name = GSS_C_EMPTY_BUFFER;
|
|
Packit Service |
9f2c4a |
gssx_name out = { .display_name.octet_string_len = 0 };
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_maj = gss_display_name(&ret_min, in, &name_buffer, &name_type);
|
|
Packit Service |
9f2c4a |
if (ret_maj) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret = gp_conv_buffer_to_gssx(&name_buffer, &out.display_name);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
ret_maj = GSS_S_FAILURE;
|
|
Packit Service |
9f2c4a |
ret_min = ret;
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
ret = gp_conv_oid_to_gssx(name_type, &out.name_type);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
ret_maj = GSS_S_FAILURE;
|
|
Packit Service |
9f2c4a |
ret_min = ret;
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_maj = gss_export_name(&ret_min, in, &exported_name);
|
|
Packit Service |
9f2c4a |
if (ret_maj == 0) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_buffer_to_gssx(&exported_name, &out.exported_name);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
ret_maj = GSS_S_FAILURE;
|
|
Packit Service |
9f2c4a |
ret_min = ret;
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
/* In case the error is GSS_S_NAME_NOT_MN the name was not
|
|
Packit Service |
9f2c4a |
* canonicalized but that is ok we simply do not export the name
|
|
Packit Service |
9f2c4a |
* in this case */
|
|
Packit Service |
9f2c4a |
if (ret_maj != GSS_S_NAME_NOT_MN) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_maj = gss_export_name_composite(&ret_min, in, &exported_composite_name);
|
|
Packit Service |
9f2c4a |
if (ret_maj == 0) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_buffer_to_gssx(&exported_composite_name, &out.exported_composite_name);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
ret_maj = GSS_S_FAILURE;
|
|
Packit Service |
9f2c4a |
ret_min = ret;
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
/* In case the error is GSS_S_NAME_NOT_MN the name was not
|
|
Packit Service |
9f2c4a |
* canonicalized but that is ok we simply do not export the name
|
|
Packit Service |
9f2c4a |
* in this case */
|
|
Packit Service |
9f2c4a |
if (ret_maj != GSS_S_NAME_NOT_MN &&
|
|
Packit Service |
9f2c4a |
ret_maj != GSS_S_UNAVAILABLE) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_maj = GSS_S_COMPLETE;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
/* out->name_attributes */
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
done:
|
|
Packit Service |
9f2c4a |
*min = ret_min;
|
|
Packit Service |
9f2c4a |
gss_release_buffer(&ret_min, &name_buffer);
|
|
Packit Service |
9f2c4a |
gss_release_buffer(&ret_min, &exported_name);
|
|
Packit Service |
9f2c4a |
gss_release_buffer(&ret_min, &exported_composite_name);
|
|
Packit Service |
9f2c4a |
if (ret_maj) {
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_buffer, (char *)&out.display_name);
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_OID, (char *)&out.name_type);
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_buffer, (char *)&out.exported_name);
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_buffer, (char *)&out.exported_composite_name);
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
*_out = out;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
return ret_maj;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
uint32_t gp_conv_name_to_gssx_alloc(uint32_t *min,
|
|
Packit Service |
9f2c4a |
gss_name_t in, gssx_name **out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gssx_name *o;
|
|
Packit Service |
9f2c4a |
uint32_t ret_maj;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = calloc(1, sizeof(gssx_name));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_maj = gp_conv_name_to_gssx(min, in, o);
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (ret_maj) {
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
return ret_maj;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
uint32_t gp_conv_gssx_to_name(uint32_t *min, gssx_name *in, gss_name_t *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gss_buffer_t input_name = GSS_C_NO_BUFFER;
|
|
Packit Service |
9f2c4a |
gss_OID name_type = GSS_C_NO_OID;
|
|
Packit Service |
9f2c4a |
gss_buffer_desc name_buffer;
|
|
Packit Service |
9f2c4a |
uint32_t ret_maj;
|
|
Packit Service |
9f2c4a |
uint32_t ret_min;
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->display_name.octet_string_len != 0) {
|
|
Packit Service |
9f2c4a |
/* ok we have a display name.
|
|
Packit Service |
9f2c4a |
* In this case always import and canonicalize it so we can
|
|
Packit Service |
9f2c4a |
* safely export the name using the original form, even if we
|
|
Packit Service |
9f2c4a |
* already have exported_name */
|
|
Packit Service |
9f2c4a |
ret = gp_conv_gssx_to_buffer_alloc(&in->display_name, &input_name);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
ret_maj = GSS_S_FAILURE;
|
|
Packit Service |
9f2c4a |
ret_min = ret;
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
ret = gp_conv_gssx_to_oid_alloc(&in->name_type, &name_type);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
ret_maj = GSS_S_FAILURE;
|
|
Packit Service |
9f2c4a |
ret_min = ret;
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_maj = gss_import_name(&ret_min, input_name, name_type, out);
|
|
Packit Service |
9f2c4a |
if (ret_maj) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
} else {
|
|
Packit Service |
9f2c4a |
gp_conv_gssx_to_buffer(&in->exported_name, &name_buffer);
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret_maj = gss_import_name(&ret_min, &name_buffer,
|
|
Packit Service |
9f2c4a |
GSS_C_NT_EXPORT_NAME, out);
|
|
Packit Service |
9f2c4a |
if (ret_maj) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
done:
|
|
Packit Service |
9f2c4a |
*min = ret_min;
|
|
Packit Service |
9f2c4a |
gss_release_buffer(&ret_min, input_name);
|
|
Packit Service |
9f2c4a |
free(input_name);
|
|
Packit Service |
9f2c4a |
gss_release_oid(&ret_min, &name_type);
|
|
Packit Service |
9f2c4a |
return ret_maj;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_status_to_gssx(uint32_t ret_maj, uint32_t ret_min,
|
|
Packit Service |
9f2c4a |
gss_OID mech, struct gssx_status *status)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
status->major_status = ret_maj;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (mech) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_oid_to_gssx(mech, &status->mech);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
status->minor_status = ret_min;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (ret_maj) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_err_to_gssx_string(ret_maj, GSS_C_GSS_CODE, mech,
|
|
Packit Service |
9f2c4a |
&status->major_status_string);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (ret_min) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_err_to_gssx_string(ret_min, GSS_C_MECH_CODE, mech,
|
|
Packit Service |
9f2c4a |
&status->minor_status_string);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret = 0;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
done:
|
|
Packit Service |
9f2c4a |
return ret;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_copy_utf8string(utf8string *in, utf8string *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
out->utf8string_val = gp_memdup(in->utf8string_val,
|
|
Packit Service |
9f2c4a |
in->utf8string_len);
|
|
Packit Service |
9f2c4a |
if (!out->utf8string_val) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
out->utf8string_len = in->utf8string_len;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_copy_gssx_status_alloc(gssx_status *in, gssx_status **out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gssx_status *o;
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = calloc(1, sizeof(gssx_status));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o->major_status = in->major_status;
|
|
Packit Service |
9f2c4a |
o->minor_status = in->minor_status;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->mech.octet_string_len) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(in->mech.octet_string_len,
|
|
Packit Service |
9f2c4a |
in->mech.octet_string_val,
|
|
Packit Service |
9f2c4a |
&o->mech);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->major_status_string.utf8string_len) {
|
|
Packit Service |
9f2c4a |
ret = gp_copy_utf8string(&in->major_status_string,
|
|
Packit Service |
9f2c4a |
&o->major_status_string);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->minor_status_string.utf8string_len) {
|
|
Packit Service |
9f2c4a |
ret = gp_copy_utf8string(&in->minor_status_string,
|
|
Packit Service |
9f2c4a |
&o->minor_status_string);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->server_ctx.octet_string_len) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(in->server_ctx.octet_string_len,
|
|
Packit Service |
9f2c4a |
in->server_ctx.octet_string_val,
|
|
Packit Service |
9f2c4a |
&o->server_ctx);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
ret = 0;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
done:
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_status, (char *)o);
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
return ret;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_gssx_to_oid_set(gssx_OID_set *in, gss_OID_set *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gss_OID_set o;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->gssx_OID_set_len == 0) {
|
|
Packit Service |
9f2c4a |
*out = GSS_C_NO_OID_SET;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = malloc(sizeof(gss_OID_set_desc));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o->count = in->gssx_OID_set_len;
|
|
Packit Service |
9f2c4a |
o->elements = calloc(o->count, sizeof(gss_OID_desc));
|
|
Packit Service |
9f2c4a |
if (!o->elements) {
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
for (size_t i = 0; i < o->count; i++) {
|
|
Packit Service |
9f2c4a |
o->elements[i].elements =
|
|
Packit Service |
9f2c4a |
gp_memdup(in->gssx_OID_set_val[i].octet_string_val,
|
|
Packit Service |
9f2c4a |
in->gssx_OID_set_val[i].octet_string_len);
|
|
Packit Service |
9f2c4a |
if (!o->elements[i].elements) {
|
|
Packit Service |
9f2c4a |
while (i > 0) {
|
|
Packit Service |
9f2c4a |
i--;
|
|
Packit Service |
9f2c4a |
free(o->elements[i].elements);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
free(o->elements);
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
o->elements[i].length = in->gssx_OID_set_val[i].octet_string_len;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_conv_oid_set_to_gssx(gss_OID_set in, gssx_OID_set *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
if (in->count == 0) {
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
out->gssx_OID_set_len = in->count;
|
|
Packit Service |
9f2c4a |
out->gssx_OID_set_val = calloc(in->count, sizeof(gssx_OID));
|
|
Packit Service |
9f2c4a |
if (!out->gssx_OID_set_val) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
for (size_t i = 0; i < in->count; i++) {
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(in->elements[i].length,
|
|
Packit Service |
9f2c4a |
in->elements[i].elements,
|
|
Packit Service |
9f2c4a |
&out->gssx_OID_set_val[i]);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
while (i > 0) {
|
|
Packit Service |
9f2c4a |
i--;
|
|
Packit Service |
9f2c4a |
free(out->gssx_OID_set_val[i].octet_string_val);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
free(out->gssx_OID_set_val);
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_copy_gssx_name(gssx_name *in, gssx_name *out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(in->display_name.octet_string_len,
|
|
Packit Service |
9f2c4a |
in->display_name.octet_string_val,
|
|
Packit Service |
9f2c4a |
&out->display_name);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(in->name_type.octet_string_len,
|
|
Packit Service |
9f2c4a |
in->name_type.octet_string_val,
|
|
Packit Service |
9f2c4a |
&out->name_type);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(in->exported_name.octet_string_len,
|
|
Packit Service |
9f2c4a |
in->exported_name.octet_string_val,
|
|
Packit Service |
9f2c4a |
&out->exported_name);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
ret = gp_conv_octet_string(in->exported_composite_name.octet_string_len,
|
|
Packit Service |
9f2c4a |
in->exported_composite_name.octet_string_val,
|
|
Packit Service |
9f2c4a |
&out->exported_composite_name);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
goto done;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
done:
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
xdr_free((xdrproc_t)xdr_gssx_name, (char *)out);
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
return ret;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
int gp_copy_gssx_name_alloc(gssx_name *in, gssx_name **out)
|
|
Packit Service |
9f2c4a |
{
|
|
Packit Service |
9f2c4a |
gssx_name *o;
|
|
Packit Service |
9f2c4a |
int ret;
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
o = calloc(1, sizeof(gssx_name));
|
|
Packit Service |
9f2c4a |
if (!o) {
|
|
Packit Service |
9f2c4a |
return ENOMEM;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
|
|
Packit Service |
9f2c4a |
ret = gp_copy_gssx_name(in, o);
|
|
Packit Service |
9f2c4a |
if (ret) {
|
|
Packit Service |
9f2c4a |
free(o);
|
|
Packit Service |
9f2c4a |
return ret;
|
|
Packit Service |
9f2c4a |
}
|
|
Packit Service |
9f2c4a |
*out = o;
|
|
Packit Service |
9f2c4a |
return 0;
|
|
Packit Service |
9f2c4a |
}
|