0dc40d9
From 23086ac768a32db1e40a9b63684dbcfd76aba033 Mon Sep 17 00:00:00 2001
0dc40d9
From: Greg Hudson <ghudson@mit.edu>
0dc40d9
Date: Wed, 4 Jan 2017 11:33:57 -0500
0dc40d9
Subject: [PATCH] Deindent crypto_retrieve_X509_sans()
0dc40d9
0dc40d9
Fix some long lines in crypto_retrieve_X509_sans() by returning early
0dc40d9
if X509_get_ext_by_NID() returns a negative result.  Also ensure that
0dc40d9
return parameters are always initialized.
0dc40d9
0dc40d9
(cherry picked from commit c6b772523db9d7791ee1c56eb512c4626556a4e7)
0dc40d9
---
0dc40d9
 src/plugins/preauth/pkinit/pkinit_crypto_openssl.c | 224 +++++++++++----------
0dc40d9
 1 file changed, 114 insertions(+), 110 deletions(-)
0dc40d9
0dc40d9
diff --git a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
0dc40d9
index bc6e7662e..8def8c542 100644
0dc40d9
--- a/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
0dc40d9
+++ b/src/plugins/preauth/pkinit/pkinit_crypto_openssl.c
0dc40d9
@@ -2101,11 +2101,21 @@ crypto_retrieve_X509_sans(krb5_context context,
0dc40d9
 {
0dc40d9
     krb5_error_code retval = EINVAL;
0dc40d9
     char buf[DN_BUF_LEN];
0dc40d9
-    int p = 0, u = 0, d = 0, l;
0dc40d9
+    int p = 0, u = 0, d = 0, ret = 0, l;
0dc40d9
     krb5_principal *princs = NULL;
0dc40d9
     krb5_principal *upns = NULL;
0dc40d9
     unsigned char **dnss = NULL;
0dc40d9
-    unsigned int i, num_found = 0;
0dc40d9
+    unsigned int i, num_found = 0, num_sans = 0;
0dc40d9
+    X509_EXTENSION *ext = NULL;
0dc40d9
+    GENERAL_NAMES *ialt = NULL;
0dc40d9
+    GENERAL_NAME *gen = NULL;
0dc40d9
+
0dc40d9
+    if (princs_ret != NULL)
0dc40d9
+        *princs_ret = NULL;
0dc40d9
+    if (upn_ret != NULL)
0dc40d9
+        *upn_ret = NULL;
0dc40d9
+    if (dns_ret != NULL)
0dc40d9
+        *dns_ret = NULL;
0dc40d9
 
0dc40d9
     if (princs_ret == NULL && upn_ret == NULL && dns_ret == NULL) {
0dc40d9
         pkiDebug("%s: nowhere to return any values!\n", __FUNCTION__);
0dc40d9
@@ -2121,118 +2131,112 @@ crypto_retrieve_X509_sans(krb5_context context,
0dc40d9
                       buf, sizeof(buf));
0dc40d9
     pkiDebug("%s: looking for SANs in cert = %s\n", __FUNCTION__, buf);
0dc40d9
 
0dc40d9
-    if ((l = X509_get_ext_by_NID(cert, NID_subject_alt_name, -1)) >= 0) {
0dc40d9
-        X509_EXTENSION *ext = NULL;
0dc40d9
-        GENERAL_NAMES *ialt = NULL;
0dc40d9
-        GENERAL_NAME *gen = NULL;
0dc40d9
-        int ret = 0;
0dc40d9
-        unsigned int num_sans = 0;
0dc40d9
+    l = X509_get_ext_by_NID(cert, NID_subject_alt_name, -1);
0dc40d9
+    if (l < 0)
0dc40d9
+        return 0;
0dc40d9
 
0dc40d9
-        if (!(ext = X509_get_ext(cert, l)) || !(ialt = X509V3_EXT_d2i(ext))) {
0dc40d9
-            pkiDebug("%s: found no subject alt name extensions\n",
0dc40d9
-                     __FUNCTION__);
0dc40d9
+    if (!(ext = X509_get_ext(cert, l)) || !(ialt = X509V3_EXT_d2i(ext))) {
0dc40d9
+        pkiDebug("%s: found no subject alt name extensions\n", __FUNCTION__);
0dc40d9
+        goto cleanup;
0dc40d9
+    }
0dc40d9
+    num_sans = sk_GENERAL_NAME_num(ialt);
0dc40d9
+
0dc40d9
+    pkiDebug("%s: found %d subject alt name extension(s)\n", __FUNCTION__,
0dc40d9
+             num_sans);
0dc40d9
+
0dc40d9
+    /* OK, we're likely returning something. Allocate return values */
0dc40d9
+    if (princs_ret != NULL) {
0dc40d9
+        princs = calloc(num_sans + 1, sizeof(krb5_principal));
0dc40d9
+        if (princs == NULL) {
0dc40d9
+            retval = ENOMEM;
0dc40d9
             goto cleanup;
0dc40d9
         }
0dc40d9
-        num_sans = sk_GENERAL_NAME_num(ialt);
0dc40d9
-
0dc40d9
-        pkiDebug("%s: found %d subject alt name extension(s)\n",
0dc40d9
-                 __FUNCTION__, num_sans);
0dc40d9
-
0dc40d9
-        /* OK, we're likely returning something. Allocate return values */
0dc40d9
-        if (princs_ret != NULL) {
0dc40d9
-            princs = calloc(num_sans + 1, sizeof(krb5_principal));
0dc40d9
-            if (princs == NULL) {
0dc40d9
-                retval = ENOMEM;
0dc40d9
-                goto cleanup;
0dc40d9
-            }
0dc40d9
-        }
0dc40d9
-        if (upn_ret != NULL) {
0dc40d9
-            upns = calloc(num_sans + 1, sizeof(krb5_principal));
0dc40d9
-            if (upns == NULL) {
0dc40d9
-                retval = ENOMEM;
0dc40d9
-                goto cleanup;
0dc40d9
-            }
0dc40d9
-        }
0dc40d9
-        if (dns_ret != NULL) {
0dc40d9
-            dnss = calloc(num_sans + 1, sizeof(*dnss));
0dc40d9
-            if (dnss == NULL) {
0dc40d9
-                retval = ENOMEM;
0dc40d9
-                goto cleanup;
0dc40d9
-            }
0dc40d9
-        }
0dc40d9
-
0dc40d9
-        for (i = 0; i < num_sans; i++) {
0dc40d9
-            krb5_data name = { 0, 0, NULL };
0dc40d9
-
0dc40d9
-            gen = sk_GENERAL_NAME_value(ialt, i);
0dc40d9
-            switch (gen->type) {
0dc40d9
-            case GEN_OTHERNAME:
0dc40d9
-                name.length = gen->d.otherName->value->value.sequence->length;
0dc40d9
-                name.data = (char *)gen->d.otherName->value->value.sequence->data;
0dc40d9
-                if (princs != NULL
0dc40d9
-                    && OBJ_cmp(plgctx->id_pkinit_san,
0dc40d9
-                               gen->d.otherName->type_id) == 0) {
0dc40d9
-#ifdef DEBUG_ASN1
0dc40d9
-                    print_buffer_bin((unsigned char *)name.data, name.length,
0dc40d9
-                                     "/tmp/pkinit_san");
0dc40d9
-#endif
0dc40d9
-                    ret = k5int_decode_krb5_principal_name(&name, &princs[p]);
0dc40d9
-                    if (ret) {
0dc40d9
-                        pkiDebug("%s: failed decoding pkinit san value\n",
0dc40d9
-                                 __FUNCTION__);
0dc40d9
-                    } else {
0dc40d9
-                        p++;
0dc40d9
-                        num_found++;
0dc40d9
-                    }
0dc40d9
-                } else if (upns != NULL
0dc40d9
-                           && OBJ_cmp(plgctx->id_ms_san_upn,
0dc40d9
-                                      gen->d.otherName->type_id) == 0) {
0dc40d9
-                    /* Prevent abuse of embedded null characters. */
0dc40d9
-                    if (memchr(name.data, '\0', name.length))
0dc40d9
-                        break;
0dc40d9
-                    ret = krb5_parse_name_flags(context, name.data,
0dc40d9
-                                                KRB5_PRINCIPAL_PARSE_ENTERPRISE,
0dc40d9
-                                                &upns[u]);
0dc40d9
-                    if (ret) {
0dc40d9
-                        pkiDebug("%s: failed parsing ms-upn san value\n",
0dc40d9
-                                 __FUNCTION__);
0dc40d9
-                    } else {
0dc40d9
-                        u++;
0dc40d9
-                        num_found++;
0dc40d9
-                    }
0dc40d9
-                } else {
0dc40d9
-                    pkiDebug("%s: unrecognized othername oid in SAN\n",
0dc40d9
-                             __FUNCTION__);
0dc40d9
-                    continue;
0dc40d9
-                }
0dc40d9
-
0dc40d9
-                break;
0dc40d9
-            case GEN_DNS:
0dc40d9
-                if (dnss != NULL) {
0dc40d9
-                    /* Prevent abuse of embedded null characters. */
0dc40d9
-                    if (memchr(gen->d.dNSName->data, '\0',
0dc40d9
-                               gen->d.dNSName->length))
0dc40d9
-                        break;
0dc40d9
-                    pkiDebug("%s: found dns name = %s\n",
0dc40d9
-                             __FUNCTION__, gen->d.dNSName->data);
0dc40d9
-                    dnss[d] = (unsigned char *)
0dc40d9
-                        strdup((char *)gen->d.dNSName->data);
0dc40d9
-                    if (dnss[d] == NULL) {
0dc40d9
-                        pkiDebug("%s: failed to duplicate dns name\n",
0dc40d9
-                                 __FUNCTION__);
0dc40d9
-                    } else {
0dc40d9
-                        d++;
0dc40d9
-                        num_found++;
0dc40d9
-                    }
0dc40d9
-                }
0dc40d9
-                break;
0dc40d9
-            default:
0dc40d9
-                pkiDebug("%s: SAN type = %d expecting %d\n",
0dc40d9
-                         __FUNCTION__, gen->type, GEN_OTHERNAME);
0dc40d9
-            }
0dc40d9
-        }
0dc40d9
-        sk_GENERAL_NAME_pop_free(ialt, GENERAL_NAME_free);
0dc40d9
     }
0dc40d9
+    if (upn_ret != NULL) {
0dc40d9
+        upns = calloc(num_sans + 1, sizeof(krb5_principal));
0dc40d9
+        if (upns == NULL) {
0dc40d9
+            retval = ENOMEM;
0dc40d9
+            goto cleanup;
0dc40d9
+        }
0dc40d9
+    }
0dc40d9
+    if (dns_ret != NULL) {
0dc40d9
+        dnss = calloc(num_sans + 1, sizeof(*dnss));
0dc40d9
+        if (dnss == NULL) {
0dc40d9
+            retval = ENOMEM;
0dc40d9
+            goto cleanup;
0dc40d9
+        }
0dc40d9
+    }
0dc40d9
+
0dc40d9
+    for (i = 0; i < num_sans; i++) {
0dc40d9
+        krb5_data name = { 0, 0, NULL };
0dc40d9
+
0dc40d9
+        gen = sk_GENERAL_NAME_value(ialt, i);
0dc40d9
+        switch (gen->type) {
0dc40d9
+        case GEN_OTHERNAME:
0dc40d9
+            name.length = gen->d.otherName->value->value.sequence->length;
0dc40d9
+            name.data = (char *)gen->d.otherName->value->value.sequence->data;
0dc40d9
+            if (princs != NULL &&
0dc40d9
+                OBJ_cmp(plgctx->id_pkinit_san,
0dc40d9
+                        gen->d.otherName->type_id) == 0) {
0dc40d9
+#ifdef DEBUG_ASN1
0dc40d9
+                print_buffer_bin((unsigned char *)name.data, name.length,
0dc40d9
+                                 "/tmp/pkinit_san");
0dc40d9
+#endif
0dc40d9
+                ret = k5int_decode_krb5_principal_name(&name, &princs[p]);
0dc40d9
+                if (ret) {
0dc40d9
+                    pkiDebug("%s: failed decoding pkinit san value\n",
0dc40d9
+                             __FUNCTION__);
0dc40d9
+                } else {
0dc40d9
+                    p++;
0dc40d9
+                    num_found++;
0dc40d9
+                }
0dc40d9
+            } else if (upns != NULL &&
0dc40d9
+                       OBJ_cmp(plgctx->id_ms_san_upn,
0dc40d9
+                               gen->d.otherName->type_id) == 0) {
0dc40d9
+                /* Prevent abuse of embedded null characters. */
0dc40d9
+                if (memchr(name.data, '\0', name.length))
0dc40d9
+                    break;
0dc40d9
+                ret = krb5_parse_name_flags(context, name.data,
0dc40d9
+                                            KRB5_PRINCIPAL_PARSE_ENTERPRISE,
0dc40d9
+                                            &upns[u]);
0dc40d9
+                if (ret) {
0dc40d9
+                    pkiDebug("%s: failed parsing ms-upn san value\n",
0dc40d9
+                             __FUNCTION__);
0dc40d9
+                } else {
0dc40d9
+                    u++;
0dc40d9
+                    num_found++;
0dc40d9
+                }
0dc40d9
+            } else {
0dc40d9
+                pkiDebug("%s: unrecognized othername oid in SAN\n",
0dc40d9
+                         __FUNCTION__);
0dc40d9
+                continue;
0dc40d9
+            }
0dc40d9
+
0dc40d9
+            break;
0dc40d9
+        case GEN_DNS:
0dc40d9
+            if (dnss != NULL) {
0dc40d9
+                /* Prevent abuse of embedded null characters. */
0dc40d9
+                if (memchr(gen->d.dNSName->data, '\0', gen->d.dNSName->length))
0dc40d9
+                    break;
0dc40d9
+                pkiDebug("%s: found dns name = %s\n", __FUNCTION__,
0dc40d9
+                         gen->d.dNSName->data);
0dc40d9
+                dnss[d] = (unsigned char *)
0dc40d9
+                    strdup((char *)gen->d.dNSName->data);
0dc40d9
+                if (dnss[d] == NULL) {
0dc40d9
+                    pkiDebug("%s: failed to duplicate dns name\n",
0dc40d9
+                             __FUNCTION__);
0dc40d9
+                } else {
0dc40d9
+                    d++;
0dc40d9
+                    num_found++;
0dc40d9
+                }
0dc40d9
+            }
0dc40d9
+            break;
0dc40d9
+        default:
0dc40d9
+            pkiDebug("%s: SAN type = %d expecting %d\n", __FUNCTION__,
0dc40d9
+                     gen->type, GEN_OTHERNAME);
0dc40d9
+        }
0dc40d9
+    }
0dc40d9
+    sk_GENERAL_NAME_pop_free(ialt, GENERAL_NAME_free);
0dc40d9
 
0dc40d9
     retval = 0;
0dc40d9
     if (princs)