| Index: nss/lib/certdb/certdb.c
|
| ===================================================================
|
| --- nss/lib/certdb/certdb.c (revision 256695)
|
| +++ nss/lib/certdb/certdb.c (working copy)
|
| @@ -1381,7 +1381,7 @@
|
| return rv;
|
| }
|
| } else {
|
| - /* New approach conforms to RFC 2818. */
|
| + /* New approach conforms to RFC 6125. */
|
| char *wildcard = PORT_Strchr(cn, '*');
|
| char *firstcndot = PORT_Strchr(cn, '.');
|
| char *secondcndot = firstcndot ? PORT_Strchr(firstcndot+1, '.') : NULL;
|
| @@ -1390,14 +1390,17 @@
|
| /* For a cn pattern to be considered valid, the wildcard character...
|
| * - may occur only in a DNS name with at least 3 components, and
|
| * - may occur only as last character in the first component, and
|
| - * - may be preceded by additional characters
|
| + * - may be preceded by additional characters, and
|
| + * - must not be preceded by an IDNA ACE prefix (xn--)
|
| */
|
| if (wildcard && secondcndot && secondcndot[1] && firsthndot
|
| - && firstcndot - wildcard == 1
|
| - && secondcndot - firstcndot > 1
|
| - && PORT_Strrchr(cn, '*') == wildcard
|
| + && firstcndot - wildcard == 1 /* wildcard is last char in first component */
|
| + && secondcndot - firstcndot > 1 /* second component is non-empty */
|
| + && PORT_Strrchr(cn, '*') == wildcard /* only one wildcard in cn */
|
| && !PORT_Strncasecmp(cn, hn, wildcard - cn)
|
| - && !PORT_Strcasecmp(firstcndot, firsthndot)) {
|
| + && !PORT_Strcasecmp(firstcndot, firsthndot)
|
| + /* If hn starts with xn--, then cn must start with wildcard */
|
| + && (PORT_Strncasecmp(hn, "xn--", 4) || wildcard == cn)) {
|
| /* valid wildcard pattern match */
|
| return SECSuccess;
|
| }
|
|
|