Set is_first and is_last correctly with ASN1_STRFLGS_UTF8_CONVERT. The comment says (in the now outdated orflags terms) that we don't need to worry about this case because is_first/is_last only affect ASCII codepoints, but it's easier to just set it correctly. Change-Id: Ib6db66adb162a555da50f563ffc9af9da4a878ec Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/53126 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/crypto/asn1/a_strex.c b/crypto/asn1/a_strex.c index 1bb574b..52d979e 100644 --- a/crypto/asn1/a_strex.c +++ b/crypto/asn1/a_strex.c
@@ -192,11 +192,8 @@ int utflen; utflen = UTF8_putc(utfbuf, sizeof utfbuf, c); for (int i = 0; i < utflen; i++) { - // We don't need to worry about setting orflags correctly - // because if utflen==1 its value will be correct anyway - // otherwise each character will be > 0x7f and so the - // character will never be escaped on first and last. - int len = do_esc_char(utfbuf[i], flags, quotes, out, is_first, is_last); + int len = do_esc_char(utfbuf[i], flags, quotes, out, is_first && i == 0, + is_last && i == utflen - 1); if (len < 0) { return -1; }
diff --git a/crypto/asn1/asn1_test.cc b/crypto/asn1/asn1_test.cc index ec6b371..c4f47bb 100644 --- a/crypto/asn1/asn1_test.cc +++ b/crypto/asn1/asn1_test.cc
@@ -1072,6 +1072,8 @@ {V_ASN1_T61STRING, StringToVector(" "), 0, ASN1_STRFLGS_ESC_2253, "\\ \\ "}, {V_ASN1_T61STRING, StringToVector(" "), 0, + ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_UTF8_CONVERT, "\\ \\ "}, + {V_ASN1_T61STRING, StringToVector(" "), 0, ASN1_STRFLGS_ESC_2253 | ASN1_STRFLGS_ESC_QUOTE, "\" \""}, // RFC 2253 only escapes # at the start of a string.