Udiff g_dsp_name.c
--- /net/etna.eng/build7/semery/mit2/webrev/usr/src/lib/libgss/g_dsp_name.c-    Wed Sep  8 17:00:19 2004
+++ g_dsp_name.c        Wed Sep  8 13:42:02 2004
@@ -1,11 +1,11 @@
 /*
  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
-#pragma ident  "@(#)g_dsp_name.c       1.14    04/09/08 SMI"
+#pragma ident  "@(#)g_dsp_name.c       1.13    04/02/23 SMI"
 
 /*
  *  glue routine for gss_display_name()
  *
  */
@@ -30,13 +30,23 @@
 
 {
        OM_uint32                       major_status;
        gss_union_name_t                union_name;
 
+       if (minor_status == NULL)
+               return (GSS_S_CALL_INACCESSIBLE_WRITE);
+       *minor_status = 0;
+
        if (input_name == 0)
-               return (GSS_S_BAD_NAME);
+               return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_BAD_NAME);
 
+       if (output_name_buffer == NULL)
+               return (GSS_S_CALL_INACCESSIBLE_WRITE);
+
+       if (output_name_type)
+               *output_name_type = NULL;
+
        union_name = (gss_union_name_t)input_name;
 
        if (union_name->mech_type) {
                /*
                 * OK, we have a mechanism-specific name; let's use it!
@@ -51,29 +61,31 @@
        /*
         * copy the value of the external_name component of the union
         * name into the output_name_buffer and point the output_name_type
         * to the name_type component of union_name
         */
-       if (output_name_type != NULL) {
+       if (output_name_type != NULL &&
+           union_name->name_type != GSS_C_NULL_OID) {
                major_status = generic_gss_copy_oid(minor_status,
                                                union_name->name_type,
                                                output_name_type);
-               if (major_status)
+               if (major_status != GSS_S_COMPLETE)
                        return (major_status);
        }
 
-       if ((output_name_buffer != NULL) {
+       if ((output_name_buffer->value =
+               malloc(union_name->external_name->length + 1)) == NULL) {
+               if (output_name_type && *output_name_type != GSS_C_NULL_OID) {
+                       (void) generic_gss_release_oid(minor_status,
+                                                   output_name_type);
+                       *output_name_type = NULL;
+               }
+               return (GSS_S_FAILURE);
+       }
                output_name_buffer->length = union_name->external_name->length;
-
-               output_name_buffer->value =
-                   (void *) malloc(output_name_buffer->length);
-
-               memcpy(output_name_buffer->value,
+       (void) memcpy(output_name_buffer->value,
                                union_name->external_name->value,
-                               output_name_buffer->length);
-    }
+               union_name->external_name->length);
+       ((char *)output_name_buffer->value)[output_name_buffer->length] = '\0';
 
-    if (minor_status)
-        *minor_status = 0;
-
        return (GSS_S_COMPLETE);
 }