Defer dedup in X509_get1_email and friends to the end

Change-Id: If92c9d954a7721d24734fe6b749cb73894ae2093
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/94029
Reviewed-by: Rudolf Polzer <rpolzer@google.com>
Auto-Submit: David Benjamin <davidben@google.com>
Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/crypto/x509/v3_utl.cc b/crypto/x509/v3_utl.cc
index 640da8e..c3b99f0 100644
--- a/crypto/x509/v3_utl.cc
+++ b/crypto/x509/v3_utl.cc
@@ -24,6 +24,7 @@
 #include <openssl/err.h>
 #include <openssl/mem.h>
 #include <openssl/obj.h>
+#include <openssl/stack.h>
 #include <openssl/x509.h>
 
 #include "../conf/internal.h"
@@ -538,6 +539,7 @@
     }
   }
   AUTHORITY_INFO_ACCESS_free(info);
+  sk_OPENSSL_STRING_sort_and_dedup(ret, str_free);
   return ret;
 }
 
@@ -578,6 +580,7 @@
       return nullptr;
     }
   }
+  sk_OPENSSL_STRING_sort_and_dedup(ret, str_free);
   return ret;
 }
 
@@ -610,13 +613,6 @@
   if (emtmp == nullptr) {
     goto err;
   }
-
-  // Don't add duplicates
-  sk_OPENSSL_STRING_sort(*sk);
-  if (sk_OPENSSL_STRING_find(*sk, nullptr, emtmp)) {
-    OPENSSL_free(emtmp);
-    return 1;
-  }
   if (!sk_OPENSSL_STRING_push(*sk, emtmp)) {
     goto err;
   }
diff --git a/crypto/x509/x509_test.cc b/crypto/x509/x509_test.cc
index 7451310..eb46b09 100644
--- a/crypto/x509/x509_test.cc
+++ b/crypto/x509/x509_test.cc
@@ -9934,7 +9934,7 @@
   EXPECT_EQ(nullptr, X509_REQ_get1_email(req.get()));
 
   // Prepare many emails.
-  constexpr size_t kCount = 100;
+  constexpr size_t kCount = 5000;
   UniquePtr<X509_NAME> subject(X509_NAME_new());
   ASSERT_TRUE(subject);
   UniquePtr<GENERAL_NAMES> sans(GENERAL_NAMES_new());
@@ -10030,7 +10030,7 @@
   EXPECT_EQ(nullptr, X509_get1_ocsp(cert.get()));
 
   // Make a certificate with many OCSP URIs.
-  constexpr size_t kCount = 100;
+  constexpr size_t kCount = 5000;
   UniquePtr<AUTHORITY_INFO_ACCESS> aia(AUTHORITY_INFO_ACCESS_new());
   ASSERT_TRUE(aia);
   std::vector<std::string> expected;