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----