From: Xiangfei Ding <xfding@google.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, dev+git@drbeat.li, davidben@google.com,
xfding <xfding@google.com>,
Xiangfei Ding <dingxiangfei2009@protonmail.ch>
Subject: [PATCH] imap-send: use ASN1_STRING_length
Date: Sun, 11 Oct 2026 21:09:28 +0000 [thread overview]
Message-ID: <20261011210928.3900020-1-xfding@google.com> (raw)
From: xfding <xfding@google.com>
X.509 has never stipulated that ASN1_STRING shall be null-terminated in general.
In OpenSSL, `ASN1_STRING_get0_data()` returns an internal pointer to
the raw string payload, which is lucky for us null-terminated. This is probably
about to change as OpenSSL derivatives like BoringSSL would adopt changes so
that the data buffer would not be null-terminated anymore.
Strictly speaking, printing or accessing `ASN1_STRING` data should always query
`ASN1_STRING_length`. This means that we should adapt `host_matches` and
`verify_hostname` to use `strncasecmp` and print strings with designated length.
Signed-off-by: Xiangfei Ding <dingxiangfei2009@protonmail.ch>
Signed-off-by: Xiangfei Ding <xfding@google.com>
---
imap-send.c | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/imap-send.c b/imap-send.c
index bf1d2cf74d..bd306b8d0a 100644
--- a/imap-send.c
+++ b/imap-send.c
@@ -225,19 +225,21 @@ static int ssl_socket_connect(struct imap_socket *sock UNUSED,
static int host_matches(const char *host, const ASN1_STRING *asn1_str)
{
const char *pattern = (const char *)ASN1_STRING_get0_data(asn1_str);
+ int pat_len = ASN1_STRING_length(asn1_str);
/* embedded NUL characters may open a security hole */
- if (memchr(pattern, '\0', ASN1_STRING_length(asn1_str)))
- return 0;
+ if (memchr(pattern, '\0', pat_len))
+ return 0;
- if (pattern[0] == '*' && pattern[1] == '.') {
+ if (pat_len >= 2 && pattern[0] == '*' && pattern[1] == '.') {
pattern += 2;
+ pat_len -= 2;
if (!(host = strchr(host, '.')))
return 0;
host++;
}
- return *host && *pattern && !strcasecmp(host, pattern);
+ return *host && strlen(host) == (size_t)pat_len && !strncasecmp(host, pattern, pat_len);
}
static int verify_hostname(X509 *cert, const char *hostname)
@@ -278,8 +280,9 @@ static int verify_hostname(X509 *cert, const char *hostname)
return error("cannot get certificate common name");
if (host_matches(hostname, cname))
return 0;
- return error("certificate owner '%s' does not match hostname '%s'",
- ASN1_STRING_get0_data(cname), hostname);
+ return error("certificate owner '%.*s' does not match hostname '%s'",
+ (int)ASN1_STRING_length(cname),
+ (const char *)ASN1_STRING_get0_data(cname), hostname);
}
static int ssl_socket_connect(struct imap_socket *sock,
--
2.56.0.385.gd3acb90ef8-goog
next reply other threads:[~2026-10-11 21:09 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-11 21:09 Xiangfei Ding [this message]
2026-10-11 23:05 ` [PATCH] imap-send: use ASN1_STRING_length Junio C Hamano
2026-10-12 15:17 ` Aniket Gupta
2026-10-12 17:18 ` Junio C Hamano
2026-10-12 20:09 ` Beat Bolli
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261011210928.3900020-1-xfding@google.com \
--to=xfding@google.com \
--cc=davidben@google.com \
--cc=dev+git@drbeat.li \
--cc=dingxiangfei2009@protonmail.ch \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.