[PATCH] Fix build failures with OpenSSL 4.0
"Kevin J. McCarthy" <[email protected]> Mon, 29 Jun 2026 13:30:47 +0800
| Newsgroups | gmane.mail.mutt.devel |
|---|---|
| Message-ID | <[email protected]> |
Starting with 4.0, the ASN1_STRING is now opaque and can no longer be
accessed directly.
See <https://openssl-library.org/post/2026-04-13-asn1_string/>
Thanks to Dennis Preiser for the bug report and patch. I've done some
minor cosmetic changes to the patch.
---
This is directly frome Dennis' patch, with a couple cosmetic changes:
I've moved the mutt_get_asn1_string macros inside the mutt_ssl.c file,
since there's no current reason to expose them.
I also put the result of the accessor into their own temporary
variables, because otherwise the comparison code was a little bit unreadable.
mutt_ssl.c | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/mutt_ssl.c b/mutt_ssl.c
index 46d9e7e2..e4c973cf 100644
--- a/mutt_ssl.c
+++ b/mutt_ssl.c
@@ -46,6 +46,15 @@
#define SSL_has_pending SSL_pending
#endif
+/* Starting OpenSSL v4, the ASN1_STRING type is now opaque */
+#if (defined(OPENSSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER >= 0x40000000L)
+ #define mutt_get_asn1_string_length(str) ASN1_STRING_length((str))
+ #define mutt_get_asn1_string_data(str) ASN1_STRING_get0_data((str))
+#else
+ #define mutt_get_asn1_string_length(str) (str)->length
+ #define mutt_get_asn1_string_data(str) (str)->data
+#endif
+
#undef _
#include <string.h>
@@ -982,11 +991,13 @@ static int check_host(X509 *x509cert, const char *hostname, char *err, size_t er
subj_alt_name = sk_GENERAL_NAME_value(subj_alt_names, i);
if (subj_alt_name->type == GEN_DNS)
{
+ int subj_alt_name_len = mutt_get_asn1_string_length(subj_alt_name->d.ia5);
+ const char *subj_alt_name_str = (const char *) mutt_get_asn1_string_data(subj_alt_name->d.ia5);
+
has_dns_entry = 1;
- if (subj_alt_name->d.ia5->length >= 0 &&
- mutt_strlen((char *)subj_alt_name->d.ia5->data) == (size_t)subj_alt_name->d.ia5->length &&
- (match_found = hostname_match(hostname_ascii,
- (char *)(subj_alt_name->d.ia5->data))))
+ if (subj_alt_name_len >= 0 &&
+ mutt_strlen(subj_alt_name_str) == (size_t) subj_alt_name_len &&
+ (match_found = hostname_match(hostname_ascii, subj_alt_name_str)))
{
break;
}
--
2.54.0