asn1: sort stacks before using find
authorPauli <pauli@openssl.org>
Thu, 27 Apr 2023 00:54:38 +0000 (10:54 +1000)
committerPauli <pauli@openssl.org>
Mon, 1 May 2023 07:14:42 +0000 (17:14 +1000)
a_strnid.c doesn't have a lock for the sort.  This is no worse than the
existing code which sorted silently without a lock.

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Todd Short <todd.short@me.com>
(Merged from https://github.com/openssl/openssl/pull/20842)

crypto/asn1/a_strnid.c
crypto/asn1/asn_mime.c

index 869ac8271488781d8b967d2a96134692bfb40d35..998468f846e62740584001316d57b590db3051bc 100644 (file)
@@ -133,7 +133,9 @@ ASN1_STRING_TABLE *ASN1_STRING_TABLE_get(int nid)
     OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
 
     fnd.nid = nid;
-    if (stable) {
+    if (stable != NULL) {
+        /* Ideally, this would be done under lock */
+        sk_ASN1_STRING_TABLE_sort(stable);
         idx = sk_ASN1_STRING_TABLE_find(stable, &fnd);
         if (idx >= 0)
             return sk_ASN1_STRING_TABLE_value(stable, idx);
index a26eac17313d3e6746fc5396ed24f5c55b2a98a1..898c204fbc9be74ba28b1a3da7dda964f91003c6 100644 (file)
@@ -679,7 +679,7 @@ static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio)
     char linebuf[MAX_SMLEN];
     MIME_HEADER *mhdr = NULL, *new_hdr = NULL;
     STACK_OF(MIME_HEADER) *headers;
-    int len, state, save_state = 0;
+    int i, len, state, save_state = 0;
 
     headers = sk_MIME_HEADER_new(mime_hdr_cmp);
     if (headers == NULL)
@@ -785,6 +785,12 @@ static STACK_OF(MIME_HEADER) *mime_parse_hdr(BIO *bio)
             break;              /* Blank line means end of headers */
     }
 
+    /* Sort the headers and their params for faster searching */
+    sk_MIME_HEADER_sort(headers);
+    for (i = 0; i < sk_MIME_HEADER_num(headers); i++)
+        if ((mhdr = sk_MIME_HEADER_value(headers, i)) != NULL
+                && mhdr->params != NULL)
+            sk_MIME_PARAM_sort(mhdr->params);
     return headers;
 
  err: