Better error reporting through com_err
[mech_eap.git] / util_oid.c
index 34b7c7b..45c37d8 100644 (file)
 
 #include "gssapiP_eap.h"
 
-#if 0
 OM_uint32
-copyOid(OM_uint32 *minor_status,
-        const gss_OID_desc * const oid,
-        gss_OID *new_oid)
+duplicateOid(OM_uint32 *minor,
+             const gss_OID_desc * const oid,
+             gss_OID *newOid)
 {
-    gss_OID         p;
+    gss_OID p;
 
-    *minor_status = 0;
+    *minor = 0;
+    *newOid = GSS_C_NO_OID;
 
-    p = (gss_OID) malloc(sizeof(gss_OID_desc));
-    if (!p) {
-        *minor_status = ENOMEM;
+    p = (gss_OID)GSSEAP_MALLOC(sizeof(*p));
+    if (p == NULL) {
+        *minor = ENOMEM;
         return GSS_S_FAILURE;
     }
     p->length = oid->length;
-    p->elements = malloc(p->length);
-    if (!p->elements) {
-        free(p);
+    p->elements = GSSEAP_MALLOC(p->length);
+    if (p->elements == NULL) {
+        GSSEAP_FREE(p);
         return GSS_S_FAILURE;
     }
+
     memcpy(p->elements, oid->elements, p->length);
-    *new_oid = p;
-    return(GSS_S_COMPLETE);
+    *newOid = p;
+
+    return GSS_S_COMPLETE;
 }
-#endif
 
 /* Compose an OID of a prefix and an integer suffix */
 OM_uint32
-composeOid(OM_uint32 *minor_status,
+composeOid(OM_uint32 *minor,
            const char *prefix,
            size_t prefix_len,
            int suffix,
@@ -96,11 +97,11 @@ composeOid(OM_uint32 *minor_status,
     unsigned char *op;
 
     if (oid == GSS_C_NO_OID) {
-        *minor_status = EINVAL;
+        *minor = EINVAL;
         return GSS_S_FAILURE;
     }
     if (oid->length < prefix_len) {
-        *minor_status = ERANGE;
+        *minor = GSSEAP_WRONG_SIZE;
         return GSS_S_FAILURE;
     }
 
@@ -115,7 +116,7 @@ composeOid(OM_uint32 *minor_status,
     suffix = osuffix;
 
     if (oid->length < prefix_len + nbytes) {
-        *minor_status = ERANGE;
+        *minor = ERANGE;
         return GSS_S_FAILURE;
     }
 
@@ -131,12 +132,12 @@ composeOid(OM_uint32 *minor_status,
 
     oid->length = prefix_len + nbytes;
 
-    *minor_status = 0;
+    *minor = 0;
     return GSS_S_COMPLETE;
 }
 
 OM_uint32
-decomposeOid(OM_uint32 *minor_status,
+decomposeOid(OM_uint32 *minor,
              const char *prefix,
              size_t prefix_len,
              gss_OID_desc *oid,
@@ -159,7 +160,7 @@ decomposeOid(OM_uint32 *minor_status,
     for (i = 0; i < slen; i++) {
         *suffix = (*suffix << 7) | (op[i] & 0x7f);
         if (i + 1 != slen && (op[i] & 0x80) == 0) {
-            *minor_status = EINVAL;
+            *minor = GSSEAP_WRONG_SIZE;
             return GSS_S_FAILURE;
         }
     }
@@ -167,20 +168,33 @@ decomposeOid(OM_uint32 *minor_status,
     return GSS_S_COMPLETE;
 }
 
-#if 0
 OM_uint32
-gssEapReleaseOid(OM_uint32 *minor, gss_OID *oid)
+duplicateOidSet(OM_uint32 *minor,
+                const gss_OID_set src,
+                gss_OID_set *dst)
 {
-    OM_uint32 major;
-
-    major = gss_internal_release_oid(minor, oid);
-    if (major == GSS_S_CONTINUE_NEEDED) {
-        GSSEAP_FREE(oid->elements);
-        GSSEAP_FREE(oid);
-        *oid = GSS_C_NO_OID;
-        major = GSS_S_COMPLETE;
+    OM_uint32 major, tmpMinor;
+    int i;
+
+    if (src == GSS_C_NO_OID_SET) {
+        *dst = GSS_C_NO_OID_SET;
+        return GSS_S_COMPLETE;
     }
 
+    major = gss_create_empty_oid_set(minor, dst);
+    if (GSS_ERROR(major))
+        return major;
+
+    for (i = 0; i < src->count; i++) {
+        gss_OID oid = &src->elements[i];
+
+        major = gss_add_oid_set_member(minor, oid, dst);
+        if (GSS_ERROR(major))
+            break;
+    }
+
+    if (GSS_ERROR(major))
+        gss_release_oid_set(&tmpMinor, dst);
+
     return major;
 }
-#endif