diff options
author | Sam Hartman <hartmans@mit.edu> | 2011-10-14 14:40:05 +0000 |
---|---|---|
committer | Sam Hartman <hartmans@mit.edu> | 2011-10-14 14:40:05 +0000 |
commit | 3ab619b8ffa9337498e49caa8e75f6e03a56e71c (patch) | |
tree | 9aab3df8aa84f628fc73bc3adc102194caea9878 /src/lib/gssapi/generic/gssapiP_generic.h | |
parent | 9493aefa8abc949ec83792de8039f09f6d664c50 (diff) | |
download | krb5-3ab619b8ffa9337498e49caa8e75f6e03a56e71c.tar.gz krb5-3ab619b8ffa9337498e49caa8e75f6e03a56e71c.tar.xz krb5-3ab619b8ffa9337498e49caa8e75f6e03a56e71c.zip |
Utility functions to move allocations from k5buf/krb5_data to gss_buffer_t
On Unix, these simply move the buffer pointer, but on windows they need to
reallocated with gssalloc_malloc and coied since the gss_buffer_t may need
to be freed in a separate module with potentially mismatched c runtime.
Also fix a mismatched parameter warning in generic_gss_copy_oid_set().
Signed-off-by: Kevin Wasserman <kevin.wasserman@painless-security.com>
git-svn-id: svn://anonsvn.mit.edu/krb5/trunk@25331 dc483132-0cff-0310-8789-dd5450dbe970
Diffstat (limited to 'src/lib/gssapi/generic/gssapiP_generic.h')
-rw-r--r-- | src/lib/gssapi/generic/gssapiP_generic.h | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/lib/gssapi/generic/gssapiP_generic.h b/src/lib/gssapi/generic/gssapiP_generic.h index e084b81bd..1124c51e5 100644 --- a/src/lib/gssapi/generic/gssapiP_generic.h +++ b/src/lib/gssapi/generic/gssapiP_generic.h @@ -41,6 +41,7 @@ #include "gssapi_generic.h" #include "gssapi_ext.h" +#include <gssapi/gssapi_alloc.h> #include "gssapi_err_generic.h" #include <errno.h> @@ -264,6 +265,42 @@ int gssint_mecherrmap_get(OM_uint32 minor, gss_OID mech_oid, OM_uint32 *mech_minor); OM_uint32 gssint_mecherrmap_map_errcode(OM_uint32 errcode); +/* + * Transfer contents of a k5buf to a gss_buffer and invalidate the source + * On unix, this is a simple pointer copy + * On windows, memory is reallocated and copied. + */ +static inline OM_uint32 +k5buf_to_gss(OM_uint32 *minor, + struct k5buf *input_k5buf, + gss_buffer_t output_buffer) +{ + OM_uint32 status = GSS_S_COMPLETE; + char *bp = krb5int_buf_data(input_k5buf); + output_buffer->length = krb5int_buf_len(input_k5buf)+1; +#ifdef _WIN32 + if (output_buffer->length > 0) { + output_buffer->value = gssalloc_malloc(output_buffer->length); + if (output_buffer->value) { + memcpy(output_buffer->value, bp, output_buffer->length); + } else { + status = GSS_S_FAILURE; + *minor = ENOMEM; + } + } else { + output_buffer->value = NULL; + } + krb5int_free_buf(input_k5buf); +#else + output_buffer->value = bp; + /* + * it would be nice to invalidate input_k5buf here + * but there is no api for that currently... + */ +#endif + return status; +} + OM_uint32 generic_gss_create_empty_buffer_set (OM_uint32 * /*minor_status*/, gss_buffer_set_t * /*buffer_set*/); @@ -279,7 +316,7 @@ OM_uint32 generic_gss_release_buffer_set OM_uint32 generic_gss_copy_oid_set (OM_uint32 *, /* minor_status */ - const gss_OID_set_desc *, /* const oidset*/ + const gss_OID_set_desc * const /*oidset*/, gss_OID_set * /*new_oidset*/); extern gss_OID_set gss_ma_known_attrs; |