summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <simo@redhat.com>2013-07-27 16:46:42 -0400
committerSimo Sorce <simo@redhat.com>2013-07-28 13:17:51 -0400
commitc68c50fb4afd9a6a62dd033b92e00ba04cf988d3 (patch)
tree205482767d4f0abc2cca2d12795fc428f25dc6c2
parent388b2da434eb7c609bb587026ac9f0748c2fc156 (diff)
downloadgss-ntlmssp-c68c50fb4afd9a6a62dd033b92e00ba04cf988d3.tar.gz
gss-ntlmssp-c68c50fb4afd9a6a62dd033b92e00ba04cf988d3.tar.xz
gss-ntlmssp-c68c50fb4afd9a6a62dd033b92e00ba04cf988d3.zip
Add helper to copy names and gss_duplicate_name
-rw-r--r--src/gss_names.c79
-rw-r--r--src/gss_ntlmssp.h5
-rw-r--r--src/gss_spi.c8
3 files changed, 92 insertions, 0 deletions
diff --git a/src/gss_names.c b/src/gss_names.c
index 7c84ad6..9ab29c6 100644
--- a/src/gss_names.c
+++ b/src/gss_names.c
@@ -238,6 +238,85 @@ uint32_t gssntlm_import_name(uint32_t *minor_status,
output_name);
}
+int gssntlm_copy_name(struct gssntlm_name *src, struct gssntlm_name *dst)
+{
+ char *dom = NULL, *usr = NULL, *srv = NULL;
+ int ret;
+ dst->type = src->type;
+ switch (src->type) {
+ case GSSNTLM_NAME_ANON:
+ break;
+ case GSSNTLM_NAME_USER:
+ if (src->data.user.domain) {
+ dom = strdup(src->data.user.domain);
+ if (!dom) {
+ ret = ENOMEM;
+ goto done;
+ }
+ }
+ if (src->data.user.name) {
+ usr = strdup(src->data.user.name);
+ if (!usr) {
+ ret = ENOMEM;
+ goto done;
+ }
+ }
+ dst->data.user.domain = dom;
+ dst->data.user.name = usr;
+ break;
+ case GSSNTLM_NAME_SERVER:
+ if (src->data.server.name) {
+ srv = strdup(src->data.server.name);
+ if (!srv) {
+ ret = ENOMEM;
+ goto done;
+ }
+ }
+ dst->data.server.name = srv;
+ break;
+ }
+
+ ret = 0;
+done:
+ if (ret) {
+ safefree(dom);
+ safefree(usr);
+ safefree(srv);
+ }
+ return ret;
+}
+
+uint32_t gssntlm_duplicate_name(uint32_t *minor_status,
+ const gss_name_t input_name,
+ gss_name_t *dest_name)
+{
+ struct gssntlm_name *in;
+ struct gssntlm_name *out;
+ uint32_t retmin;
+
+ *minor_status = 0;
+
+ if (input_name == GSS_C_NO_NAME || dest_name == NULL) {
+ return GSS_S_CALL_INACCESSIBLE_READ;
+ }
+
+ in = (struct gssntlm_name *)input_name;
+
+ out = calloc(1, sizeof(struct gssntlm_name));
+ if (!out) {
+ *minor_status = ENOMEM;
+ return GSS_S_FAILURE;
+ }
+
+ retmin = gssntlm_copy_name(in, out);
+
+ *minor_status = retmin;
+ if (retmin) return GSS_S_FAILURE;
+
+ *dest_name = (gss_name_t)out;
+ return GSS_S_COMPLETE;
+}
+
void gssntlm_int_release_name(struct gssntlm_name *name)
{
if (!name) return;
diff --git a/src/gss_ntlmssp.h b/src/gss_ntlmssp.h
index b6eda2f..8ea8851 100644
--- a/src/gss_ntlmssp.h
+++ b/src/gss_ntlmssp.h
@@ -141,6 +141,7 @@ int gssntlm_get_lm_compatibility_level(void);
void gssntlm_int_release_name(struct gssntlm_name *name);
void gssntlm_int_release_cred(struct gssntlm_cred *cred);
+int gssntlm_copy_name(struct gssntlm_name *src, struct gssntlm_name *dst);
int gssntlm_copy_creds(struct gssntlm_cred *in, struct gssntlm_cred *out);
extern const gss_OID_desc gssntlm_oid;
@@ -180,6 +181,10 @@ uint32_t gssntlm_import_name_by_mech(uint32_t *minor_status,
gss_OID input_name_type,
gss_name_t *output_name);
+uint32_t gssntlm_duplicate_name(uint32_t *minor_status,
+ const gss_name_t input_name,
+ gss_name_t *dest_name);
+
uint32_t gssntlm_release_name(uint32_t *minor_status,
gss_name_t *input_name);
diff --git a/src/gss_spi.c b/src/gss_spi.c
index 21d8d53..44db903 100644
--- a/src/gss_spi.c
+++ b/src/gss_spi.c
@@ -127,6 +127,14 @@ OM_uint32 gssspi_import_name_by_mech(OM_uint32 *minor_status,
output_name);
}
+OM_uint32 gss_duplicate_name(OM_uint32 *minor_status,
+ const gss_name_t input_name,
+ gss_name_t *dest_name)
+{
+ return gssntlm_duplicate_name(minor_status,
+ input_name, dest_name);
+}
+
OM_uint32 gss_release_name(OM_uint32 *minor_status,
gss_name_t *input_name)
{