1 /* 2 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 3 * Use is subject to license terms. 4 */ 5 6 | #pragma ident "@(#)g_inquire_context.c 1.16 04/09/08 SMI" 6 | #pragma ident "@(#)g_inquire_context.c 1.15 04/02/23 SMI" 7 8 /* 9 * glue routine for gss_inquire_context 10 */ 11 12 #include <mechglueP.h> 13 #include <stdlib.h> 14 15 /* Last argument new for V2 */ 16 OM_uint32 17 gss_inquire_context( 18 minor_status, 19 context_handle, 20 src_name, 21 targ_name, 22 lifetime_rec, 23 mech_type, 24 ctx_flags, 25 locally_initiated, 26 open) 27 28 OM_uint32 *minor_status; 29 const gss_ctx_id_t context_handle; 30 gss_name_t *src_name; 31 gss_name_t *targ_name; 32 OM_uint32 *lifetime_rec; 33 gss_OID *mech_type; 34 OM_uint32 *ctx_flags; 35 int *locally_initiated; 36 int *open; 37 38 { 39 gss_union_ctx_id_t ctx; 40 gss_mechanism mech; 41 OM_uint32 status, temp_minor; 42 + gss_name_t localTargName = NULL, localSourceName = NULL; 43 43 | gss_initialize(); 44 | if (!minor_status) 45 + return (GSS_S_CALL_INACCESSIBLE_WRITE); 46 45 | /* if the context_handle is Null, return NO_CONTEXT error */ 47 | *minor_status = 0; 48 49 + /* if the context_handle is Null, return NO_CONTEXT error */ 50 if (context_handle == GSS_C_NO_CONTEXT) 48 | return (GSS_S_NO_CONTEXT); 51 | return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT); 52 53 + /* set all output value to NULL */ 54 + if (src_name) 55 + *src_name = NULL; 56 + 57 + if (targ_name) 58 + *targ_name = NULL; 59 + 60 + if (mech_type) 61 + *mech_type = NULL; 62 + 63 /* 64 * select the approprate underlying mechanism routine and 65 * call it. 66 */ 67 68 ctx = (gss_union_ctx_id_t)context_handle; 69 mech = __gss_get_mechanism(ctx->mech_type); 70 58 | if (!mech || !mech->gss_inquire_context || !mech->gss_display_name) { 59 | return (GSS_S_NO_CONTEXT); 71 | if (!mech || !mech->gss_inquire_context || !mech->gss_display_name || 72 | !mech->gss_release_name) { 73 + return (GSS_S_UNAVAILABLE); 74 } 75 76 status = mech->gss_inquire_context( 77 mech->context, 78 minor_status, 79 ctx->internal_ctx_id, 66 | src_name, 67 | targ_name, 80 | (src_name ? &localSourceName : NULL), 81 | (targ_name ? &localTargName : NULL), 82 lifetime_rec, 69 | mech_type, 83 | NULL, 84 ctx_flags, 85 locally_initiated, 86 open); 87 88 if (status != GSS_S_COMPLETE) { 89 return (status); 90 } 91 92 /* need to convert names */ 93 if (src_name) { 94 status = __gss_convert_name_to_union_name(minor_status, mech, 81 | *src_name, src_name); 95 | localSourceName, src_name); 96 if (status != GSS_S_COMPLETE) { 97 + if (localTargName) 98 mech->gss_release_name(mech->context, 84 | &temp_minor, src_name); 85 | mech->gss_release_name(mech->context, 99 | &temp_minor, &localTargName); 100 | return (status); 86 - &temp_minor, targ_name); 87 - if (mech_type) { 88 - gss_release_oid(&temp_minor, mech_type); 90 - return (GSS_S_FAILURE); 101 } 92 - } 102 } 103 104 if (targ_name) { 105 status = __gss_convert_name_to_union_name(minor_status, mech, 96 | *targ_name, targ_name); 106 | localTargName, targ_name); 107 108 if (status != GSS_S_COMPLETE) { 99 | if (mech_type) 100 | (void) gss_release_oid(&temp_minor, mech_type); 109 | if (src_name) 110 | (void) gss_release_name(&temp_minor, src_name); 111 102 | return (GSS_S_FAILURE); 112 | return (status); 113 } 114 } 115 116 + /* spec says mech type must point to static storage */ 117 + if (mech_type) 118 + *mech_type = &mech->mech_type; 119 return (GSS_S_COMPLETE); 120 } ----Unchanged portion omitted----