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;