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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox