Add sk_FOO_sort_and_dedup

Change-Id: I5021af1485faebbe664841a2927bf178c8a9cafd
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/94028
Commit-Queue: David Benjamin <davidben@google.com>
Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: David Benjamin <davidben@google.com>
Reviewed-by: Rudolf Polzer <rpolzer@google.com>
diff --git a/crypto/stack/stack.cc b/crypto/stack/stack.cc
index 67c7162..391f473 100644
--- a/crypto/stack/stack.cc
+++ b/crypto/stack/stack.cc
@@ -365,6 +365,26 @@
   sk->sorted = 1;
 }
 
+void OPENSSL_sk_sort_and_dedup(
+    OPENSSL_STACK *sk, OPENSSL_sk_call_cmp_func call_cmp_func,
+    OPENSSL_sk_call_free_func call_free_func, OPENSSL_sk_free_func free_func) {
+  OPENSSL_sk_sort(sk, call_cmp_func);
+  if (sk == nullptr || sk->comp == nullptr || sk->num <= 1) {
+    return;
+  }
+
+  size_t new_num = 1;
+  for (size_t i = 1; i < sk->num; i++) {
+    if (call_cmp_func(sk->comp, sk->data[i], sk->data[new_num - 1]) != 0) {
+      sk->data[new_num] = sk->data[i];
+      new_num++;
+    } else if (free_func != nullptr) {
+      call_free_func(free_func, sk->data[i]);
+    }
+  }
+  sk->num = new_num;
+}
+
 int OPENSSL_sk_is_sorted(const OPENSSL_STACK *sk) {
   if (!sk) {
     return 1;
diff --git a/crypto/stack/stack_test.cc b/crypto/stack/stack_test.cc
index 7da842d..80aeb5e 100644
--- a/crypto/stack/stack_test.cc
+++ b/crypto/stack/stack_test.cc
@@ -486,6 +486,43 @@
   EXPECT_TRUE(sk_TEST_INT_is_sorted(sk.get()));
 }
 
+TEST(StackTest, SortAndDedup) {
+  UniquePtr<STACK_OF(TEST_INT)> sk(sk_TEST_INT_new(compare));
+  ASSERT_TRUE(sk);
+  sk_TEST_INT_sort_and_dedup(sk.get(), TEST_INT_free);
+  ExpectStackEquals(sk.get(), std::vector<int>{});
+
+  for (int v : {1, 2, 3, 4, 5, 2, 2, 2, 2, 3}) {
+    auto obj = TEST_INT_new(v);
+    ASSERT_TRUE(obj);
+    ASSERT_TRUE(PushToStack(sk.get(), std::move(obj)));
+  }
+
+  sk_TEST_INT_sort_and_dedup(sk.get(), TEST_INT_free);
+  ExpectStackEquals(sk.get(), {1, 2, 3, 4, 5});
+
+  sk_TEST_INT_sort_and_dedup(sk.get(), TEST_INT_free);
+  ExpectStackEquals(sk.get(), {1, 2, 3, 4, 5});
+
+  // Repeat with non-owning pointers.
+  sk.reset(sk_TEST_INT_new(compare));
+  ASSERT_TRUE(sk);
+  for (int v : {1, 2, 3, 4, 5, 2, 2, 2, 2, 3}) {
+    auto obj = TEST_INT_new(v);
+    ASSERT_TRUE(obj);
+    ASSERT_TRUE(PushToStack(sk.get(), std::move(obj)));
+  }
+
+  // |not_owned| does not own its contents, so we cannot use bssl::UniquePtr.
+  STACK_OF(TEST_INT) *not_owned = sk_TEST_INT_dup(sk.get());
+  ASSERT_TRUE(not_owned);
+  sk_TEST_INT_sort_and_dedup(not_owned, nullptr);
+  ExpectStackEquals(not_owned, {1, 2, 3, 4, 5});
+  sk_TEST_INT_sort_and_dedup(not_owned, nullptr);
+  ExpectStackEquals(not_owned, {1, 2, 3, 4, 5});
+  sk_TEST_INT_free(not_owned);
+}
+
 TEST(StackTest, IsSorted) {
   UniquePtr<STACK_OF(TEST_INT)> sk(sk_TEST_INT_new_null());
   ASSERT_TRUE(sk);
diff --git a/include/openssl/prefix_symbols.h b/include/openssl/prefix_symbols.h
index 12588ab..c2bbbe6 100644
--- a/include/openssl/prefix_symbols.h
+++ b/include/openssl/prefix_symbols.h
@@ -1536,6 +1536,7 @@
 #pragma redefine_extname OPENSSL_sk_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_set_cmp_func)
 #pragma redefine_extname OPENSSL_sk_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_shift)
 #pragma redefine_extname OPENSSL_sk_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_sort)
+#pragma redefine_extname OPENSSL_sk_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_sort_and_dedup)
 #pragma redefine_extname OPENSSL_sk_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_value)
 #pragma redefine_extname OPENSSL_sk_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_sk_zero)
 #pragma redefine_extname OPENSSL_strcasecmp BORINGSSL_ADD_USER_LABEL_AND_PREFIX(OPENSSL_strcasecmp)
@@ -4632,6 +4633,7 @@
 #define OPENSSL_sk_set_cmp_func BORINGSSL_ADD_PREFIX(OPENSSL_sk_set_cmp_func)
 #define OPENSSL_sk_shift BORINGSSL_ADD_PREFIX(OPENSSL_sk_shift)
 #define OPENSSL_sk_sort BORINGSSL_ADD_PREFIX(OPENSSL_sk_sort)
+#define OPENSSL_sk_sort_and_dedup BORINGSSL_ADD_PREFIX(OPENSSL_sk_sort_and_dedup)
 #define OPENSSL_sk_value BORINGSSL_ADD_PREFIX(OPENSSL_sk_value)
 #define OPENSSL_sk_zero BORINGSSL_ADD_PREFIX(OPENSSL_sk_zero)
 #define OPENSSL_strcasecmp BORINGSSL_ADD_PREFIX(OPENSSL_strcasecmp)
@@ -6263,6 +6265,7 @@
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_set_cmp_func)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_shift)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_sort)
+#pragma redefine_extname sk_ACCESS_DESCRIPTION_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_sort_and_dedup)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_value)
 #pragma redefine_extname sk_ACCESS_DESCRIPTION_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ACCESS_DESCRIPTION_zero)
 #pragma redefine_extname sk_ASN1_INTEGER_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_call_cmp_func)
@@ -6288,6 +6291,7 @@
 #pragma redefine_extname sk_ASN1_INTEGER_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_set_cmp_func)
 #pragma redefine_extname sk_ASN1_INTEGER_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_shift)
 #pragma redefine_extname sk_ASN1_INTEGER_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_sort)
+#pragma redefine_extname sk_ASN1_INTEGER_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_sort_and_dedup)
 #pragma redefine_extname sk_ASN1_INTEGER_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_value)
 #pragma redefine_extname sk_ASN1_INTEGER_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_INTEGER_zero)
 #pragma redefine_extname sk_ASN1_OBJECT_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_call_cmp_func)
@@ -6313,6 +6317,7 @@
 #pragma redefine_extname sk_ASN1_OBJECT_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_set_cmp_func)
 #pragma redefine_extname sk_ASN1_OBJECT_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_shift)
 #pragma redefine_extname sk_ASN1_OBJECT_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_sort)
+#pragma redefine_extname sk_ASN1_OBJECT_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_sort_and_dedup)
 #pragma redefine_extname sk_ASN1_OBJECT_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_value)
 #pragma redefine_extname sk_ASN1_OBJECT_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_OBJECT_zero)
 #pragma redefine_extname sk_ASN1_TYPE_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_call_cmp_func)
@@ -6338,6 +6343,7 @@
 #pragma redefine_extname sk_ASN1_TYPE_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_set_cmp_func)
 #pragma redefine_extname sk_ASN1_TYPE_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_shift)
 #pragma redefine_extname sk_ASN1_TYPE_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_sort)
+#pragma redefine_extname sk_ASN1_TYPE_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_sort_and_dedup)
 #pragma redefine_extname sk_ASN1_TYPE_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_value)
 #pragma redefine_extname sk_ASN1_TYPE_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_TYPE_zero)
 #pragma redefine_extname sk_ASN1_VALUE_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_call_cmp_func)
@@ -6363,6 +6369,7 @@
 #pragma redefine_extname sk_ASN1_VALUE_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_set_cmp_func)
 #pragma redefine_extname sk_ASN1_VALUE_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_shift)
 #pragma redefine_extname sk_ASN1_VALUE_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_sort)
+#pragma redefine_extname sk_ASN1_VALUE_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_sort_and_dedup)
 #pragma redefine_extname sk_ASN1_VALUE_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_value)
 #pragma redefine_extname sk_ASN1_VALUE_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_ASN1_VALUE_zero)
 #pragma redefine_extname sk_BIO_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_call_cmp_func)
@@ -6388,6 +6395,7 @@
 #pragma redefine_extname sk_BIO_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_set_cmp_func)
 #pragma redefine_extname sk_BIO_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_shift)
 #pragma redefine_extname sk_BIO_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_sort)
+#pragma redefine_extname sk_BIO_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_sort_and_dedup)
 #pragma redefine_extname sk_BIO_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_value)
 #pragma redefine_extname sk_BIO_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_BIO_zero)
 #pragma redefine_extname sk_CONF_VALUE_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_call_cmp_func)
@@ -6413,6 +6421,7 @@
 #pragma redefine_extname sk_CONF_VALUE_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_set_cmp_func)
 #pragma redefine_extname sk_CONF_VALUE_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_shift)
 #pragma redefine_extname sk_CONF_VALUE_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_sort)
+#pragma redefine_extname sk_CONF_VALUE_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_sort_and_dedup)
 #pragma redefine_extname sk_CONF_VALUE_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_value)
 #pragma redefine_extname sk_CONF_VALUE_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CONF_VALUE_zero)
 #pragma redefine_extname sk_CRYPTO_BUFFER_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_call_cmp_func)
@@ -6438,6 +6447,7 @@
 #pragma redefine_extname sk_CRYPTO_BUFFER_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_set_cmp_func)
 #pragma redefine_extname sk_CRYPTO_BUFFER_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_shift)
 #pragma redefine_extname sk_CRYPTO_BUFFER_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_sort)
+#pragma redefine_extname sk_CRYPTO_BUFFER_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_sort_and_dedup)
 #pragma redefine_extname sk_CRYPTO_BUFFER_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_value)
 #pragma redefine_extname sk_CRYPTO_BUFFER_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_CRYPTO_BUFFER_zero)
 #pragma redefine_extname sk_DIST_POINT_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_call_cmp_func)
@@ -6463,6 +6473,7 @@
 #pragma redefine_extname sk_DIST_POINT_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_set_cmp_func)
 #pragma redefine_extname sk_DIST_POINT_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_shift)
 #pragma redefine_extname sk_DIST_POINT_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_sort)
+#pragma redefine_extname sk_DIST_POINT_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_sort_and_dedup)
 #pragma redefine_extname sk_DIST_POINT_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_value)
 #pragma redefine_extname sk_DIST_POINT_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_DIST_POINT_zero)
 #pragma redefine_extname sk_GENERAL_NAME_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_call_cmp_func)
@@ -6488,6 +6499,7 @@
 #pragma redefine_extname sk_GENERAL_NAME_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_set_cmp_func)
 #pragma redefine_extname sk_GENERAL_NAME_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_shift)
 #pragma redefine_extname sk_GENERAL_NAME_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_sort)
+#pragma redefine_extname sk_GENERAL_NAME_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_sort_and_dedup)
 #pragma redefine_extname sk_GENERAL_NAME_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_value)
 #pragma redefine_extname sk_GENERAL_NAME_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_NAME_zero)
 #pragma redefine_extname sk_GENERAL_SUBTREE_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_call_cmp_func)
@@ -6513,6 +6525,7 @@
 #pragma redefine_extname sk_GENERAL_SUBTREE_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_set_cmp_func)
 #pragma redefine_extname sk_GENERAL_SUBTREE_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_shift)
 #pragma redefine_extname sk_GENERAL_SUBTREE_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_sort)
+#pragma redefine_extname sk_GENERAL_SUBTREE_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_sort_and_dedup)
 #pragma redefine_extname sk_GENERAL_SUBTREE_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_value)
 #pragma redefine_extname sk_GENERAL_SUBTREE_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_GENERAL_SUBTREE_zero)
 #pragma redefine_extname sk_OPENSSL_STRING_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_call_cmp_func)
@@ -6538,6 +6551,7 @@
 #pragma redefine_extname sk_OPENSSL_STRING_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_set_cmp_func)
 #pragma redefine_extname sk_OPENSSL_STRING_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_shift)
 #pragma redefine_extname sk_OPENSSL_STRING_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_sort)
+#pragma redefine_extname sk_OPENSSL_STRING_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_sort_and_dedup)
 #pragma redefine_extname sk_OPENSSL_STRING_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_value)
 #pragma redefine_extname sk_OPENSSL_STRING_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_OPENSSL_STRING_zero)
 #pragma redefine_extname sk_POLICYINFO_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_call_cmp_func)
@@ -6563,6 +6577,7 @@
 #pragma redefine_extname sk_POLICYINFO_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_set_cmp_func)
 #pragma redefine_extname sk_POLICYINFO_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_shift)
 #pragma redefine_extname sk_POLICYINFO_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_sort)
+#pragma redefine_extname sk_POLICYINFO_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_sort_and_dedup)
 #pragma redefine_extname sk_POLICYINFO_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_value)
 #pragma redefine_extname sk_POLICYINFO_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYINFO_zero)
 #pragma redefine_extname sk_POLICYQUALINFO_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_call_cmp_func)
@@ -6588,6 +6603,7 @@
 #pragma redefine_extname sk_POLICYQUALINFO_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_set_cmp_func)
 #pragma redefine_extname sk_POLICYQUALINFO_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_shift)
 #pragma redefine_extname sk_POLICYQUALINFO_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_sort)
+#pragma redefine_extname sk_POLICYQUALINFO_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_sort_and_dedup)
 #pragma redefine_extname sk_POLICYQUALINFO_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_value)
 #pragma redefine_extname sk_POLICYQUALINFO_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICYQUALINFO_zero)
 #pragma redefine_extname sk_POLICY_MAPPING_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_call_cmp_func)
@@ -6613,6 +6629,7 @@
 #pragma redefine_extname sk_POLICY_MAPPING_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_set_cmp_func)
 #pragma redefine_extname sk_POLICY_MAPPING_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_shift)
 #pragma redefine_extname sk_POLICY_MAPPING_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_sort)
+#pragma redefine_extname sk_POLICY_MAPPING_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_sort_and_dedup)
 #pragma redefine_extname sk_POLICY_MAPPING_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_value)
 #pragma redefine_extname sk_POLICY_MAPPING_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_POLICY_MAPPING_zero)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_call_cmp_func)
@@ -6638,6 +6655,7 @@
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_set_cmp_func)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_shift)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_sort)
+#pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_sort_and_dedup)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_value)
 #pragma redefine_extname sk_SRTP_PROTECTION_PROFILE_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SRTP_PROTECTION_PROFILE_zero)
 #pragma redefine_extname sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_call_cmp_func)
@@ -6663,6 +6681,7 @@
 #pragma redefine_extname sk_SSL_CIPHER_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_set_cmp_func)
 #pragma redefine_extname sk_SSL_CIPHER_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_shift)
 #pragma redefine_extname sk_SSL_CIPHER_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_sort)
+#pragma redefine_extname sk_SSL_CIPHER_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_sort_and_dedup)
 #pragma redefine_extname sk_SSL_CIPHER_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_value)
 #pragma redefine_extname sk_SSL_CIPHER_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_CIPHER_zero)
 #pragma redefine_extname sk_SSL_COMP_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_call_cmp_func)
@@ -6688,6 +6707,7 @@
 #pragma redefine_extname sk_SSL_COMP_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_set_cmp_func)
 #pragma redefine_extname sk_SSL_COMP_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_shift)
 #pragma redefine_extname sk_SSL_COMP_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_sort)
+#pragma redefine_extname sk_SSL_COMP_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_sort_and_dedup)
 #pragma redefine_extname sk_SSL_COMP_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_value)
 #pragma redefine_extname sk_SSL_COMP_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_SSL_COMP_zero)
 #pragma redefine_extname sk_TRUST_TOKEN_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_call_cmp_func)
@@ -6713,6 +6733,7 @@
 #pragma redefine_extname sk_TRUST_TOKEN_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_set_cmp_func)
 #pragma redefine_extname sk_TRUST_TOKEN_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_shift)
 #pragma redefine_extname sk_TRUST_TOKEN_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_sort)
+#pragma redefine_extname sk_TRUST_TOKEN_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_sort_and_dedup)
 #pragma redefine_extname sk_TRUST_TOKEN_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_value)
 #pragma redefine_extname sk_TRUST_TOKEN_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_TRUST_TOKEN_zero)
 #pragma redefine_extname sk_X509_ALGOR_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_call_cmp_func)
@@ -6738,6 +6759,7 @@
 #pragma redefine_extname sk_X509_ALGOR_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_set_cmp_func)
 #pragma redefine_extname sk_X509_ALGOR_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_shift)
 #pragma redefine_extname sk_X509_ALGOR_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_sort)
+#pragma redefine_extname sk_X509_ALGOR_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_sort_and_dedup)
 #pragma redefine_extname sk_X509_ALGOR_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_value)
 #pragma redefine_extname sk_X509_ALGOR_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ALGOR_zero)
 #pragma redefine_extname sk_X509_ATTRIBUTE_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_call_cmp_func)
@@ -6763,6 +6785,7 @@
 #pragma redefine_extname sk_X509_ATTRIBUTE_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_set_cmp_func)
 #pragma redefine_extname sk_X509_ATTRIBUTE_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_shift)
 #pragma redefine_extname sk_X509_ATTRIBUTE_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_sort)
+#pragma redefine_extname sk_X509_ATTRIBUTE_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_sort_and_dedup)
 #pragma redefine_extname sk_X509_ATTRIBUTE_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_value)
 #pragma redefine_extname sk_X509_ATTRIBUTE_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_ATTRIBUTE_zero)
 #pragma redefine_extname sk_X509_CRL_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_call_cmp_func)
@@ -6788,6 +6811,7 @@
 #pragma redefine_extname sk_X509_CRL_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_set_cmp_func)
 #pragma redefine_extname sk_X509_CRL_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_shift)
 #pragma redefine_extname sk_X509_CRL_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_sort)
+#pragma redefine_extname sk_X509_CRL_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_sort_and_dedup)
 #pragma redefine_extname sk_X509_CRL_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_value)
 #pragma redefine_extname sk_X509_CRL_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_CRL_zero)
 #pragma redefine_extname sk_X509_EXTENSION_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_call_cmp_func)
@@ -6813,6 +6837,7 @@
 #pragma redefine_extname sk_X509_EXTENSION_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_set_cmp_func)
 #pragma redefine_extname sk_X509_EXTENSION_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_shift)
 #pragma redefine_extname sk_X509_EXTENSION_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_sort)
+#pragma redefine_extname sk_X509_EXTENSION_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_sort_and_dedup)
 #pragma redefine_extname sk_X509_EXTENSION_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_value)
 #pragma redefine_extname sk_X509_EXTENSION_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_EXTENSION_zero)
 #pragma redefine_extname sk_X509_INFO_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_call_cmp_func)
@@ -6838,6 +6863,7 @@
 #pragma redefine_extname sk_X509_INFO_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_set_cmp_func)
 #pragma redefine_extname sk_X509_INFO_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_shift)
 #pragma redefine_extname sk_X509_INFO_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_sort)
+#pragma redefine_extname sk_X509_INFO_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_sort_and_dedup)
 #pragma redefine_extname sk_X509_INFO_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_value)
 #pragma redefine_extname sk_X509_INFO_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_INFO_zero)
 #pragma redefine_extname sk_X509_NAME_ENTRY_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_call_cmp_func)
@@ -6863,6 +6889,7 @@
 #pragma redefine_extname sk_X509_NAME_ENTRY_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_set_cmp_func)
 #pragma redefine_extname sk_X509_NAME_ENTRY_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_shift)
 #pragma redefine_extname sk_X509_NAME_ENTRY_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_sort)
+#pragma redefine_extname sk_X509_NAME_ENTRY_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_sort_and_dedup)
 #pragma redefine_extname sk_X509_NAME_ENTRY_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_value)
 #pragma redefine_extname sk_X509_NAME_ENTRY_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_ENTRY_zero)
 #pragma redefine_extname sk_X509_NAME_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_call_cmp_func)
@@ -6888,6 +6915,7 @@
 #pragma redefine_extname sk_X509_NAME_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_set_cmp_func)
 #pragma redefine_extname sk_X509_NAME_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_shift)
 #pragma redefine_extname sk_X509_NAME_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_sort)
+#pragma redefine_extname sk_X509_NAME_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_sort_and_dedup)
 #pragma redefine_extname sk_X509_NAME_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_value)
 #pragma redefine_extname sk_X509_NAME_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_NAME_zero)
 #pragma redefine_extname sk_X509_OBJECT_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_call_cmp_func)
@@ -6913,6 +6941,7 @@
 #pragma redefine_extname sk_X509_OBJECT_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_set_cmp_func)
 #pragma redefine_extname sk_X509_OBJECT_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_shift)
 #pragma redefine_extname sk_X509_OBJECT_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_sort)
+#pragma redefine_extname sk_X509_OBJECT_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_sort_and_dedup)
 #pragma redefine_extname sk_X509_OBJECT_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_value)
 #pragma redefine_extname sk_X509_OBJECT_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_OBJECT_zero)
 #pragma redefine_extname sk_X509_REVOKED_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_call_cmp_func)
@@ -6938,6 +6967,7 @@
 #pragma redefine_extname sk_X509_REVOKED_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_set_cmp_func)
 #pragma redefine_extname sk_X509_REVOKED_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_shift)
 #pragma redefine_extname sk_X509_REVOKED_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_sort)
+#pragma redefine_extname sk_X509_REVOKED_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_sort_and_dedup)
 #pragma redefine_extname sk_X509_REVOKED_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_value)
 #pragma redefine_extname sk_X509_REVOKED_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_REVOKED_zero)
 #pragma redefine_extname sk_X509_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_call_cmp_func)
@@ -6963,6 +6993,7 @@
 #pragma redefine_extname sk_X509_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_set_cmp_func)
 #pragma redefine_extname sk_X509_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_shift)
 #pragma redefine_extname sk_X509_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_sort)
+#pragma redefine_extname sk_X509_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_sort_and_dedup)
 #pragma redefine_extname sk_X509_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_value)
 #pragma redefine_extname sk_X509_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_X509_zero)
 #pragma redefine_extname sk_void_call_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_call_cmp_func)
@@ -6988,6 +7019,7 @@
 #pragma redefine_extname sk_void_set_cmp_func BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_set_cmp_func)
 #pragma redefine_extname sk_void_shift BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_shift)
 #pragma redefine_extname sk_void_sort BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_sort)
+#pragma redefine_extname sk_void_sort_and_dedup BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_sort_and_dedup)
 #pragma redefine_extname sk_void_value BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_value)
 #pragma redefine_extname sk_void_zero BORINGSSL_ADD_USER_LABEL_AND_PREFIX(sk_void_zero)
 
@@ -7023,6 +7055,7 @@
 #define sk_ACCESS_DESCRIPTION_set_cmp_func BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_set_cmp_func)
 #define sk_ACCESS_DESCRIPTION_shift BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_shift)
 #define sk_ACCESS_DESCRIPTION_sort BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_sort)
+#define sk_ACCESS_DESCRIPTION_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_sort_and_dedup)
 #define sk_ACCESS_DESCRIPTION_value BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_value)
 #define sk_ACCESS_DESCRIPTION_zero BORINGSSL_ADD_PREFIX(sk_ACCESS_DESCRIPTION_zero)
 #define sk_ASN1_INTEGER_call_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_call_cmp_func)
@@ -7048,6 +7081,7 @@
 #define sk_ASN1_INTEGER_set_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_set_cmp_func)
 #define sk_ASN1_INTEGER_shift BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_shift)
 #define sk_ASN1_INTEGER_sort BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_sort)
+#define sk_ASN1_INTEGER_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_sort_and_dedup)
 #define sk_ASN1_INTEGER_value BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_value)
 #define sk_ASN1_INTEGER_zero BORINGSSL_ADD_PREFIX(sk_ASN1_INTEGER_zero)
 #define sk_ASN1_OBJECT_call_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_call_cmp_func)
@@ -7073,6 +7107,7 @@
 #define sk_ASN1_OBJECT_set_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_set_cmp_func)
 #define sk_ASN1_OBJECT_shift BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_shift)
 #define sk_ASN1_OBJECT_sort BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_sort)
+#define sk_ASN1_OBJECT_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_sort_and_dedup)
 #define sk_ASN1_OBJECT_value BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_value)
 #define sk_ASN1_OBJECT_zero BORINGSSL_ADD_PREFIX(sk_ASN1_OBJECT_zero)
 #define sk_ASN1_TYPE_call_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_call_cmp_func)
@@ -7098,6 +7133,7 @@
 #define sk_ASN1_TYPE_set_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_set_cmp_func)
 #define sk_ASN1_TYPE_shift BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_shift)
 #define sk_ASN1_TYPE_sort BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_sort)
+#define sk_ASN1_TYPE_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_sort_and_dedup)
 #define sk_ASN1_TYPE_value BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_value)
 #define sk_ASN1_TYPE_zero BORINGSSL_ADD_PREFIX(sk_ASN1_TYPE_zero)
 #define sk_ASN1_VALUE_call_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_call_cmp_func)
@@ -7123,6 +7159,7 @@
 #define sk_ASN1_VALUE_set_cmp_func BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_set_cmp_func)
 #define sk_ASN1_VALUE_shift BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_shift)
 #define sk_ASN1_VALUE_sort BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_sort)
+#define sk_ASN1_VALUE_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_sort_and_dedup)
 #define sk_ASN1_VALUE_value BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_value)
 #define sk_ASN1_VALUE_zero BORINGSSL_ADD_PREFIX(sk_ASN1_VALUE_zero)
 #define sk_BIO_call_cmp_func BORINGSSL_ADD_PREFIX(sk_BIO_call_cmp_func)
@@ -7148,6 +7185,7 @@
 #define sk_BIO_set_cmp_func BORINGSSL_ADD_PREFIX(sk_BIO_set_cmp_func)
 #define sk_BIO_shift BORINGSSL_ADD_PREFIX(sk_BIO_shift)
 #define sk_BIO_sort BORINGSSL_ADD_PREFIX(sk_BIO_sort)
+#define sk_BIO_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_BIO_sort_and_dedup)
 #define sk_BIO_value BORINGSSL_ADD_PREFIX(sk_BIO_value)
 #define sk_BIO_zero BORINGSSL_ADD_PREFIX(sk_BIO_zero)
 #define sk_CONF_VALUE_call_cmp_func BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_call_cmp_func)
@@ -7173,6 +7211,7 @@
 #define sk_CONF_VALUE_set_cmp_func BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_set_cmp_func)
 #define sk_CONF_VALUE_shift BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_shift)
 #define sk_CONF_VALUE_sort BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_sort)
+#define sk_CONF_VALUE_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_sort_and_dedup)
 #define sk_CONF_VALUE_value BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_value)
 #define sk_CONF_VALUE_zero BORINGSSL_ADD_PREFIX(sk_CONF_VALUE_zero)
 #define sk_CRYPTO_BUFFER_call_cmp_func BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_call_cmp_func)
@@ -7198,6 +7237,7 @@
 #define sk_CRYPTO_BUFFER_set_cmp_func BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_set_cmp_func)
 #define sk_CRYPTO_BUFFER_shift BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_shift)
 #define sk_CRYPTO_BUFFER_sort BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_sort)
+#define sk_CRYPTO_BUFFER_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_sort_and_dedup)
 #define sk_CRYPTO_BUFFER_value BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_value)
 #define sk_CRYPTO_BUFFER_zero BORINGSSL_ADD_PREFIX(sk_CRYPTO_BUFFER_zero)
 #define sk_DIST_POINT_call_cmp_func BORINGSSL_ADD_PREFIX(sk_DIST_POINT_call_cmp_func)
@@ -7223,6 +7263,7 @@
 #define sk_DIST_POINT_set_cmp_func BORINGSSL_ADD_PREFIX(sk_DIST_POINT_set_cmp_func)
 #define sk_DIST_POINT_shift BORINGSSL_ADD_PREFIX(sk_DIST_POINT_shift)
 #define sk_DIST_POINT_sort BORINGSSL_ADD_PREFIX(sk_DIST_POINT_sort)
+#define sk_DIST_POINT_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_DIST_POINT_sort_and_dedup)
 #define sk_DIST_POINT_value BORINGSSL_ADD_PREFIX(sk_DIST_POINT_value)
 #define sk_DIST_POINT_zero BORINGSSL_ADD_PREFIX(sk_DIST_POINT_zero)
 #define sk_GENERAL_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_call_cmp_func)
@@ -7248,6 +7289,7 @@
 #define sk_GENERAL_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_set_cmp_func)
 #define sk_GENERAL_NAME_shift BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_shift)
 #define sk_GENERAL_NAME_sort BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_sort)
+#define sk_GENERAL_NAME_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_sort_and_dedup)
 #define sk_GENERAL_NAME_value BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_value)
 #define sk_GENERAL_NAME_zero BORINGSSL_ADD_PREFIX(sk_GENERAL_NAME_zero)
 #define sk_GENERAL_SUBTREE_call_cmp_func BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_call_cmp_func)
@@ -7273,6 +7315,7 @@
 #define sk_GENERAL_SUBTREE_set_cmp_func BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_set_cmp_func)
 #define sk_GENERAL_SUBTREE_shift BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_shift)
 #define sk_GENERAL_SUBTREE_sort BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_sort)
+#define sk_GENERAL_SUBTREE_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_sort_and_dedup)
 #define sk_GENERAL_SUBTREE_value BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_value)
 #define sk_GENERAL_SUBTREE_zero BORINGSSL_ADD_PREFIX(sk_GENERAL_SUBTREE_zero)
 #define sk_OPENSSL_STRING_call_cmp_func BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_call_cmp_func)
@@ -7298,6 +7341,7 @@
 #define sk_OPENSSL_STRING_set_cmp_func BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_set_cmp_func)
 #define sk_OPENSSL_STRING_shift BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_shift)
 #define sk_OPENSSL_STRING_sort BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_sort)
+#define sk_OPENSSL_STRING_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_sort_and_dedup)
 #define sk_OPENSSL_STRING_value BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_value)
 #define sk_OPENSSL_STRING_zero BORINGSSL_ADD_PREFIX(sk_OPENSSL_STRING_zero)
 #define sk_POLICYINFO_call_cmp_func BORINGSSL_ADD_PREFIX(sk_POLICYINFO_call_cmp_func)
@@ -7323,6 +7367,7 @@
 #define sk_POLICYINFO_set_cmp_func BORINGSSL_ADD_PREFIX(sk_POLICYINFO_set_cmp_func)
 #define sk_POLICYINFO_shift BORINGSSL_ADD_PREFIX(sk_POLICYINFO_shift)
 #define sk_POLICYINFO_sort BORINGSSL_ADD_PREFIX(sk_POLICYINFO_sort)
+#define sk_POLICYINFO_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_POLICYINFO_sort_and_dedup)
 #define sk_POLICYINFO_value BORINGSSL_ADD_PREFIX(sk_POLICYINFO_value)
 #define sk_POLICYINFO_zero BORINGSSL_ADD_PREFIX(sk_POLICYINFO_zero)
 #define sk_POLICYQUALINFO_call_cmp_func BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_call_cmp_func)
@@ -7348,6 +7393,7 @@
 #define sk_POLICYQUALINFO_set_cmp_func BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_set_cmp_func)
 #define sk_POLICYQUALINFO_shift BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_shift)
 #define sk_POLICYQUALINFO_sort BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_sort)
+#define sk_POLICYQUALINFO_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_sort_and_dedup)
 #define sk_POLICYQUALINFO_value BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_value)
 #define sk_POLICYQUALINFO_zero BORINGSSL_ADD_PREFIX(sk_POLICYQUALINFO_zero)
 #define sk_POLICY_MAPPING_call_cmp_func BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_call_cmp_func)
@@ -7373,6 +7419,7 @@
 #define sk_POLICY_MAPPING_set_cmp_func BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_set_cmp_func)
 #define sk_POLICY_MAPPING_shift BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_shift)
 #define sk_POLICY_MAPPING_sort BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_sort)
+#define sk_POLICY_MAPPING_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_sort_and_dedup)
 #define sk_POLICY_MAPPING_value BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_value)
 #define sk_POLICY_MAPPING_zero BORINGSSL_ADD_PREFIX(sk_POLICY_MAPPING_zero)
 #define sk_SRTP_PROTECTION_PROFILE_call_cmp_func BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_call_cmp_func)
@@ -7398,6 +7445,7 @@
 #define sk_SRTP_PROTECTION_PROFILE_set_cmp_func BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_set_cmp_func)
 #define sk_SRTP_PROTECTION_PROFILE_shift BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_shift)
 #define sk_SRTP_PROTECTION_PROFILE_sort BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_sort)
+#define sk_SRTP_PROTECTION_PROFILE_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_sort_and_dedup)
 #define sk_SRTP_PROTECTION_PROFILE_value BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_value)
 #define sk_SRTP_PROTECTION_PROFILE_zero BORINGSSL_ADD_PREFIX(sk_SRTP_PROTECTION_PROFILE_zero)
 #define sk_SSL_CIPHER_call_cmp_func BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_call_cmp_func)
@@ -7423,6 +7471,7 @@
 #define sk_SSL_CIPHER_set_cmp_func BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_set_cmp_func)
 #define sk_SSL_CIPHER_shift BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_shift)
 #define sk_SSL_CIPHER_sort BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_sort)
+#define sk_SSL_CIPHER_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_sort_and_dedup)
 #define sk_SSL_CIPHER_value BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_value)
 #define sk_SSL_CIPHER_zero BORINGSSL_ADD_PREFIX(sk_SSL_CIPHER_zero)
 #define sk_SSL_COMP_call_cmp_func BORINGSSL_ADD_PREFIX(sk_SSL_COMP_call_cmp_func)
@@ -7448,6 +7497,7 @@
 #define sk_SSL_COMP_set_cmp_func BORINGSSL_ADD_PREFIX(sk_SSL_COMP_set_cmp_func)
 #define sk_SSL_COMP_shift BORINGSSL_ADD_PREFIX(sk_SSL_COMP_shift)
 #define sk_SSL_COMP_sort BORINGSSL_ADD_PREFIX(sk_SSL_COMP_sort)
+#define sk_SSL_COMP_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_SSL_COMP_sort_and_dedup)
 #define sk_SSL_COMP_value BORINGSSL_ADD_PREFIX(sk_SSL_COMP_value)
 #define sk_SSL_COMP_zero BORINGSSL_ADD_PREFIX(sk_SSL_COMP_zero)
 #define sk_TRUST_TOKEN_call_cmp_func BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_call_cmp_func)
@@ -7473,6 +7523,7 @@
 #define sk_TRUST_TOKEN_set_cmp_func BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_set_cmp_func)
 #define sk_TRUST_TOKEN_shift BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_shift)
 #define sk_TRUST_TOKEN_sort BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_sort)
+#define sk_TRUST_TOKEN_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_sort_and_dedup)
 #define sk_TRUST_TOKEN_value BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_value)
 #define sk_TRUST_TOKEN_zero BORINGSSL_ADD_PREFIX(sk_TRUST_TOKEN_zero)
 #define sk_X509_ALGOR_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_call_cmp_func)
@@ -7498,6 +7549,7 @@
 #define sk_X509_ALGOR_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_set_cmp_func)
 #define sk_X509_ALGOR_shift BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_shift)
 #define sk_X509_ALGOR_sort BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_sort)
+#define sk_X509_ALGOR_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_sort_and_dedup)
 #define sk_X509_ALGOR_value BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_value)
 #define sk_X509_ALGOR_zero BORINGSSL_ADD_PREFIX(sk_X509_ALGOR_zero)
 #define sk_X509_ATTRIBUTE_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_call_cmp_func)
@@ -7523,6 +7575,7 @@
 #define sk_X509_ATTRIBUTE_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_set_cmp_func)
 #define sk_X509_ATTRIBUTE_shift BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_shift)
 #define sk_X509_ATTRIBUTE_sort BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_sort)
+#define sk_X509_ATTRIBUTE_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_sort_and_dedup)
 #define sk_X509_ATTRIBUTE_value BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_value)
 #define sk_X509_ATTRIBUTE_zero BORINGSSL_ADD_PREFIX(sk_X509_ATTRIBUTE_zero)
 #define sk_X509_CRL_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_CRL_call_cmp_func)
@@ -7548,6 +7601,7 @@
 #define sk_X509_CRL_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_CRL_set_cmp_func)
 #define sk_X509_CRL_shift BORINGSSL_ADD_PREFIX(sk_X509_CRL_shift)
 #define sk_X509_CRL_sort BORINGSSL_ADD_PREFIX(sk_X509_CRL_sort)
+#define sk_X509_CRL_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_CRL_sort_and_dedup)
 #define sk_X509_CRL_value BORINGSSL_ADD_PREFIX(sk_X509_CRL_value)
 #define sk_X509_CRL_zero BORINGSSL_ADD_PREFIX(sk_X509_CRL_zero)
 #define sk_X509_EXTENSION_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_call_cmp_func)
@@ -7573,6 +7627,7 @@
 #define sk_X509_EXTENSION_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_set_cmp_func)
 #define sk_X509_EXTENSION_shift BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_shift)
 #define sk_X509_EXTENSION_sort BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_sort)
+#define sk_X509_EXTENSION_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_sort_and_dedup)
 #define sk_X509_EXTENSION_value BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_value)
 #define sk_X509_EXTENSION_zero BORINGSSL_ADD_PREFIX(sk_X509_EXTENSION_zero)
 #define sk_X509_INFO_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_INFO_call_cmp_func)
@@ -7598,6 +7653,7 @@
 #define sk_X509_INFO_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_INFO_set_cmp_func)
 #define sk_X509_INFO_shift BORINGSSL_ADD_PREFIX(sk_X509_INFO_shift)
 #define sk_X509_INFO_sort BORINGSSL_ADD_PREFIX(sk_X509_INFO_sort)
+#define sk_X509_INFO_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_INFO_sort_and_dedup)
 #define sk_X509_INFO_value BORINGSSL_ADD_PREFIX(sk_X509_INFO_value)
 #define sk_X509_INFO_zero BORINGSSL_ADD_PREFIX(sk_X509_INFO_zero)
 #define sk_X509_NAME_ENTRY_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_call_cmp_func)
@@ -7623,6 +7679,7 @@
 #define sk_X509_NAME_ENTRY_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_set_cmp_func)
 #define sk_X509_NAME_ENTRY_shift BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_shift)
 #define sk_X509_NAME_ENTRY_sort BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_sort)
+#define sk_X509_NAME_ENTRY_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_sort_and_dedup)
 #define sk_X509_NAME_ENTRY_value BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_value)
 #define sk_X509_NAME_ENTRY_zero BORINGSSL_ADD_PREFIX(sk_X509_NAME_ENTRY_zero)
 #define sk_X509_NAME_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_NAME_call_cmp_func)
@@ -7648,6 +7705,7 @@
 #define sk_X509_NAME_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_NAME_set_cmp_func)
 #define sk_X509_NAME_shift BORINGSSL_ADD_PREFIX(sk_X509_NAME_shift)
 #define sk_X509_NAME_sort BORINGSSL_ADD_PREFIX(sk_X509_NAME_sort)
+#define sk_X509_NAME_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_NAME_sort_and_dedup)
 #define sk_X509_NAME_value BORINGSSL_ADD_PREFIX(sk_X509_NAME_value)
 #define sk_X509_NAME_zero BORINGSSL_ADD_PREFIX(sk_X509_NAME_zero)
 #define sk_X509_OBJECT_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_call_cmp_func)
@@ -7673,6 +7731,7 @@
 #define sk_X509_OBJECT_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_set_cmp_func)
 #define sk_X509_OBJECT_shift BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_shift)
 #define sk_X509_OBJECT_sort BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_sort)
+#define sk_X509_OBJECT_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_sort_and_dedup)
 #define sk_X509_OBJECT_value BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_value)
 #define sk_X509_OBJECT_zero BORINGSSL_ADD_PREFIX(sk_X509_OBJECT_zero)
 #define sk_X509_REVOKED_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_call_cmp_func)
@@ -7698,6 +7757,7 @@
 #define sk_X509_REVOKED_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_set_cmp_func)
 #define sk_X509_REVOKED_shift BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_shift)
 #define sk_X509_REVOKED_sort BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_sort)
+#define sk_X509_REVOKED_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_sort_and_dedup)
 #define sk_X509_REVOKED_value BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_value)
 #define sk_X509_REVOKED_zero BORINGSSL_ADD_PREFIX(sk_X509_REVOKED_zero)
 #define sk_X509_call_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_call_cmp_func)
@@ -7723,6 +7783,7 @@
 #define sk_X509_set_cmp_func BORINGSSL_ADD_PREFIX(sk_X509_set_cmp_func)
 #define sk_X509_shift BORINGSSL_ADD_PREFIX(sk_X509_shift)
 #define sk_X509_sort BORINGSSL_ADD_PREFIX(sk_X509_sort)
+#define sk_X509_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_X509_sort_and_dedup)
 #define sk_X509_value BORINGSSL_ADD_PREFIX(sk_X509_value)
 #define sk_X509_zero BORINGSSL_ADD_PREFIX(sk_X509_zero)
 #define sk_void_call_cmp_func BORINGSSL_ADD_PREFIX(sk_void_call_cmp_func)
@@ -7748,6 +7809,7 @@
 #define sk_void_set_cmp_func BORINGSSL_ADD_PREFIX(sk_void_set_cmp_func)
 #define sk_void_shift BORINGSSL_ADD_PREFIX(sk_void_shift)
 #define sk_void_sort BORINGSSL_ADD_PREFIX(sk_void_sort)
+#define sk_void_sort_and_dedup BORINGSSL_ADD_PREFIX(sk_void_sort_and_dedup)
 #define sk_void_value BORINGSSL_ADD_PREFIX(sk_void_value)
 #define sk_void_zero BORINGSSL_ADD_PREFIX(sk_void_zero)
 
diff --git a/include/openssl/stack.h b/include/openssl/stack.h
index 8fd26fa..3bda503 100644
--- a/include/openssl/stack.h
+++ b/include/openssl/stack.h
@@ -204,6 +204,12 @@
 // elements that are equivalent under the comparison function.
 void sk_SAMPLE_sort(STACK_OF(SAMPLE) *sk);
 
+// sk_SAMPLE_sort_and_dedup sorts the elements of |sk| based on the comparison
+// function and removes duplicates. If |free_func| is not NULL, it is called on
+// every removed element.
+void sk_SAMPLE_sort_and_dedup(STACK_OF(SAMPLE) *sk,
+                              sk_SAMPLE_free_func free_func);
+
 // sk_SAMPLE_is_sorted returns one if |sk| is known to be sorted and zero
 // otherwise.
 int sk_SAMPLE_is_sorted(const STACK_OF(SAMPLE) *sk);
@@ -297,6 +303,9 @@
 OPENSSL_EXPORT OPENSSL_STACK *OPENSSL_sk_dup(const OPENSSL_STACK *sk);
 OPENSSL_EXPORT void OPENSSL_sk_sort(OPENSSL_STACK *sk,
                                     OPENSSL_sk_call_cmp_func call_cmp_func);
+OPENSSL_EXPORT void OPENSSL_sk_sort_and_dedup(
+    OPENSSL_STACK *sk, OPENSSL_sk_call_cmp_func call_cmp_func,
+    OPENSSL_sk_call_free_func call_free_func, OPENSSL_sk_free_func free_func);
 OPENSSL_EXPORT int OPENSSL_sk_is_sorted(const OPENSSL_STACK *sk);
 OPENSSL_EXPORT OPENSSL_sk_cmp_func
 OPENSSL_sk_set_cmp_func(OPENSSL_STACK *sk, OPENSSL_sk_cmp_func comp);
@@ -504,6 +513,13 @@
     OPENSSL_sk_sort((OPENSSL_STACK *)sk, sk_##name##_call_cmp_func);           \
   }                                                                            \
                                                                                \
+  OPENSSL_INLINE void sk_##name##_sort_and_dedup(                              \
+      STACK_OF(name) *sk, sk_##name##_free_func free_func) {                   \
+    OPENSSL_sk_sort_and_dedup((OPENSSL_STACK *)sk, sk_##name##_call_cmp_func,  \
+                              sk_##name##_call_free_func,                      \
+                              (OPENSSL_sk_free_func)free_func);                \
+  }                                                                            \
+                                                                               \
   OPENSSL_INLINE int sk_##name##_is_sorted(const STACK_OF(name) *sk) {         \
     return OPENSSL_sk_is_sorted((const OPENSSL_STACK *)sk);                    \
   }                                                                            \