svn rev #25358: trunk/src/lib/gssapi/krb5/

hartmans@MIT.EDU hartmans at MIT.EDU
Sun Oct 16 20:45:30 EDT 2011


http://src.mit.edu/fisheye/changelog/krb5/?cs=25358
Commit By: hartmans
Log Message:
gssalloc-related fixes to naming_exts.c

renamed kg_data_list_to_buffer_set_nocopy to data_list_buffer_set
(since nocopy is no longer guaranteed).
removed extra indirection to input krb5_data list.
ensured input krb5_data list is always completely freed.
no longer returns EINVAL when output buffer set is NULL.
fixed krb5_gss_get_name_attribute to use data_to_gss.

Signed-off-by: Kevin Wasserman <kevin.wasserman at painless-security.com>


Changed Files:
U   trunk/src/lib/gssapi/krb5/naming_exts.c
Modified: trunk/src/lib/gssapi/krb5/naming_exts.c
===================================================================
--- trunk/src/lib/gssapi/krb5/naming_exts.c	2011-10-17 00:45:23 UTC (rev 25357)
+++ trunk/src/lib/gssapi/krb5/naming_exts.c	2011-10-17 00:45:30 UTC (rev 25358)
@@ -204,27 +204,26 @@
 
 /* Owns data on success */
 static krb5_error_code
-kg_data_list_to_buffer_set_nocopy(krb5_data **pdata,
-                                  gss_buffer_set_t *buffer_set)
+data_list_to_buffer_set(krb5_context context,
+                        krb5_data *data,
+                        gss_buffer_set_t *buffer_set)
 {
-    gss_buffer_set_t set;
+    gss_buffer_set_t set = GSS_C_NO_BUFFER_SET;
     OM_uint32 minor_status;
-    unsigned int i;
-    krb5_data *data;
+    int i;
+    krb5_error_code code = 0;
 
-    data = *pdata;
+    if (data == NULL)
+        goto cleanup;
 
-    if (data == NULL) {
-        if (buffer_set != NULL)
-            *buffer_set = GSS_C_NO_BUFFER_SET;
-        return 0;
-    } else if (buffer_set == NULL)
-        return EINVAL;
+    if (buffer_set == NULL)
+        goto cleanup;
 
     if (GSS_ERROR(gss_create_empty_buffer_set(&minor_status,
                                               &set))) {
         assert(minor_status != 0);
-        return minor_status;
+        code = minor_status;
+        goto cleanup;
     }
 
     for (i = 0; data[i].data != NULL; i++)
@@ -234,7 +233,8 @@
     set->elements = gssalloc_calloc(i, sizeof(gss_buffer_desc));
     if (set->elements == NULL) {
         gss_release_buffer_set(&minor_status, &set);
-        return ENOMEM;
+        code = ENOMEM;
+        goto cleanup;
     }
 
     /*
@@ -245,16 +245,17 @@
     for (i = set->count-1; i >= 0; i--) {
         if (data_to_gss(&data[i], &set->elements[i])) {
             gss_release_buffer_set(&minor_status, &set);
-            return ENOMEM;
+            code = ENOMEM;
+            goto cleanup;
         }
     }
+cleanup:
+    krb5int_free_data_list(context, data);
 
-    free(data);
-    *pdata = NULL;
+    if (buffer_set != NULL)
+        *buffer_set = set;
 
-    *buffer_set = set;
-
-    return 0;
+    return code;
 }
 
 OM_uint32 KRB5_CALLCONV
@@ -301,7 +302,8 @@
     if (code != 0)
         goto cleanup;
 
-    code = kg_data_list_to_buffer_set_nocopy(&kattrs, attrs);
+    code = data_list_to_buffer_set(context, kattrs, attrs);
+    kattrs = NULL;
     if (code != 0)
         goto cleanup;
 
@@ -376,19 +378,20 @@
                                        display_value ? &kdisplay_value : NULL,
                                        more);
     if (code == 0) {
-        if (value != NULL) {
-            value->value = kvalue.data;
-            value->length = kvalue.length;
-        }
+        if (value != NULL)
+            code = data_to_gss(&kvalue, value);
 
         if (authenticated != NULL)
             *authenticated = kauthenticated;
         if (complete != NULL)
             *complete = kcomplete;
 
-        if (display_value != NULL) {
-            display_value->value = kdisplay_value.data;
-            display_value->length = kdisplay_value.length;
+        if (display_value != NULL)
+        {
+            if (code != 0)
+                code = data_to_gss(&kdisplay_value, display_value);
+            else
+                free(kdisplay_value.data);
         }
     }
 




More information about the cvs-krb5 mailing list