Cdiff g_imp_sec_context.c
--- /net/etna.eng/build7/semery/mit2/webrev/usr/src/lib/libgss/g_imp_sec_context.c- Wed Sep 8 17:00:26 2004
+++ g_imp_sec_context.c Wed Sep 8 13:42:03 2004
@@ -1,11 +1,11 @@
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
-#pragma ident "@(#)g_imp_sec_context.c 1.19 04/09/08 SMI"
+#pragma ident "@(#)g_imp_sec_context.c 1.18 04/02/23 SMI"
/*
* glue routine gss_export_sec_context
*/
@@ -23,52 +23,63 @@
OM_uint32 * minor_status;
const gss_buffer_t interprocess_token;
gss_ctx_id_t *context_handle;
{
- OM_uint32 length;
+ OM_uint32 length = 0;
OM_uint32 status;
char *p;
gss_union_ctx_id_t ctx;
gss_buffer_desc token;
gss_mechanism mech;
- gss_initialize();
-
+ if (minor_status == NULL)
+ return (GSS_S_CALL_INACCESSIBLE_WRITE);
*minor_status = 0;
- if (interprocess_token->length == 0 || interprocess_token->value == 0)
- return (GSS_S_DEFECTIVE_TOKEN);
+ if (context_handle == NULL)
+ return (GSS_S_CALL_INACCESSIBLE_WRITE | GSS_S_NO_CONTEXT);
+ *context_handle = GSS_C_NO_CONTEXT;
+ if (GSS_EMPTY_BUFFER(interprocess_token))
+ return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_DEFECTIVE_TOKEN);
+
status = GSS_S_FAILURE;
ctx = (gss_union_ctx_id_t)malloc(sizeof (gss_union_ctx_id_desc));
- if (!ctx) {
- *minor_status = ENOMEM;
+ if (!ctx)
return (GSS_S_FAILURE);
- }
+
ctx->mech_type = (gss_OID) malloc(sizeof (gss_OID_desc));
if (!ctx->mech_type) {
- *minor_status = ENOMEM;
- goto error_out;
+ free(ctx);
+ return (GSS_S_FAILURE);
}
+
+ if (interprocess_token->length >= sizeof (OM_uint32)) {
p = interprocess_token->value;
length = (OM_uint32)*p++;
length = (OM_uint32)(length << 8) + *p++;
length = (OM_uint32)(length << 8) + *p++;
length = (OM_uint32)(length << 8) + *p++;
+ }
+ if (length == 0 ||
+ length > (interprocess_token->length - sizeof (OM_uint32))) {
+ free(ctx);
+ return (GSS_S_CALL_BAD_STRUCTURE | GSS_S_DEFECTIVE_TOKEN);
+ }
+
ctx->mech_type->length = length;
ctx->mech_type->elements = malloc(length);
if (!ctx->mech_type->elements) {
- *minor_status = ENOMEM;
goto error_out;
}
(void) memcpy(ctx->mech_type->elements, p, length);
p += length;
- token.length = interprocess_token->length - 4 - length;
+ token.length = interprocess_token->length - sizeof (OM_uint32) - length;
token.value = p;
/*
* select the approprate underlying mechanism routine and
* call it.
@@ -78,11 +89,11 @@
if (!mech) {
status = GSS_S_BAD_MECH;
goto error_out;
}
if (!mech->gss_import_sec_context) {
- status = GSS_S_BAD_BINDINGS;
+ status = GSS_S_UNAVAILABLE;
goto error_out;
}
status = mech->gss_import_sec_context(mech->context, minor_status,
&token, &ctx->internal_ctx_id);