diff options
author | Simo Sorce <simo@redhat.com> | 2013-07-27 16:46:42 -0400 |
---|---|---|
committer | Simo Sorce <simo@redhat.com> | 2013-07-28 13:17:51 -0400 |
commit | c68c50fb4afd9a6a62dd033b92e00ba04cf988d3 (patch) | |
tree | 205482767d4f0abc2cca2d12795fc428f25dc6c2 | |
parent | 388b2da434eb7c609bb587026ac9f0748c2fc156 (diff) | |
download | gss-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.c | 79 | ||||
-rw-r--r-- | src/gss_ntlmssp.h | 5 | ||||
-rw-r--r-- | src/gss_spi.c | 8 |
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) { |