1   /*
   2    * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
   3    * Use is subject to license terms.
   4    */
   5   
   6 | #pragma ident        "@(#)g_dsp_name.c        1.14        04/09/08 SMI"
   6 | #pragma ident        "@(#)g_dsp_name.c        1.13        04/02/23 SMI"
   7   
   8   /*
   9    *  glue routine for gss_display_name()
  10    *
  11    */
  12   
  13   #include <mechglueP.h>
  14   #include <stdio.h>
  15   #ifdef HAVE_STDLIB_H
  16   #include <stdlib.h>
  17   #endif
  18   #include <string.h>
  19   
  20   OM_uint32
  21   gss_display_name(minor_status,
  22                           input_name,
  23                           output_name_buffer,
  24                           output_name_type)
  25   
  26   OM_uint32 *                        minor_status;
  27   const gss_name_t                input_name;
  28   gss_buffer_t                        output_name_buffer;
  29   gss_OID *                        output_name_type;
  30   
  31   {
  32           OM_uint32                        major_status;
  33           gss_union_name_t                union_name;
  34   
  35 +         if (minor_status == NULL)
  36 +                 return (GSS_S_CALL_INACCESSIBLE_WRITE);
  37 +         *minor_status = 0;
  38 + 
  39           if (input_name == 0)
  36 |                 return (GSS_S_BAD_NAME);
  40 |                 return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME);
  41   
  42 +         if (output_name_buffer == NULL)
  43 +                 return (GSS_S_CALL_INACCESSIBLE_WRITE);
  44 + 
  45 +         if (output_name_type)
  46 +                 *output_name_type = NULL;
  47 + 
  48           union_name = (gss_union_name_t)input_name;
  49   
  50           if (union_name->mech_type) {
  51                   /*
  52                    * OK, we have a mechanism-specific name; let's use it!
  53                    */
  54                   return (__gss_display_internal_name(minor_status,
  55                                                           union_name->mech_type,
  56                                                           union_name->mech_name,
  57                                                           output_name_buffer,
  58                                                           output_name_type));
  59           }
  60   
  61           /*
  62            * copy the value of the external_name component of the union
  63            * name into the output_name_buffer and point the output_name_type
  64            * to the name_type component of union_name
  65            */
  56 |         if (output_name_type != NULL) {
  66 |         if (output_name_type != NULL &&
  67 +             union_name->name_type != GSS_C_NULL_OID) {
  68                   major_status = generic_gss_copy_oid(minor_status,
  69                                                   union_name->name_type,
  70                                                   output_name_type);
  60 |                 if (major_status)
  71 |                 if (major_status != GSS_S_COMPLETE)
  72                           return (major_status);
  73           }
  74   
  64 |         if ((output_name_buffer != NULL) {
  75 |         if ((output_name_buffer->value =
  76 +                 malloc(union_name->external_name->length + 1)) == NULL) {
  77 +                 if (output_name_type && *output_name_type != GSS_C_NULL_OID) {
  78 +                         (void) generic_gss_release_oid(minor_status,
  79 +                                                     output_name_type);
  80 +                         *output_name_type = NULL;
  81 +                 }
  82 +                 return (GSS_S_FAILURE);
  83 +         }
  84           output_name_buffer->length = union_name->external_name->length;
  66 | 
  85 |         (void) memcpy(output_name_buffer->value,
  67 -                 output_name_buffer->value =
  68 -                     (void *) malloc(output_name_buffer->length);
  69 - 
  70 -                 memcpy(output_name_buffer->value,
  86                       union_name->external_name->value,
  72 |                                output_name_buffer->length);
  73 |     }
  87 |                 union_name->external_name->length);
  88 |         ((char *)output_name_buffer->value)[output_name_buffer->length] = '\0';
  75 -     if (minor_status)
  76 -         *minor_status = 0;
  77 - 
  89   
  90           return (GSS_S_COMPLETE);
  91   }

 ----Unchanged portion omitted----