| Index: nss/mozilla/security/nss/lib/certdb/certdb.c | 
| =================================================================== | 
| --- nss/mozilla/security/nss/lib/certdb/certdb.c	(revision 61548) | 
| +++ nss/mozilla/security/nss/lib/certdb/certdb.c	(working copy) | 
| @@ -39,7 +39,7 @@ | 
| /* | 
| * Certificate handling code | 
| * | 
| - * $Id: certdb.c,v 1.104 2010/04/25 00:44:55 nelson%bolyard.com Exp $ | 
| + * $Id: certdb.c,v 1.104.2.2 2010/09/02 00:52:02 wtc%google.com Exp $ | 
| */ | 
|  | 
| #include "nssilock.h" | 
| @@ -1415,6 +1415,15 @@ | 
| return; | 
| } | 
|  | 
| +static PRBool | 
| +cert_IsIPAddr(const char *hn) | 
| +{ | 
| +    PRBool            isIPaddr       = PR_FALSE; | 
| +    PRNetAddr         netAddr; | 
| +    isIPaddr = (PR_SUCCESS == PR_StringToNetAddr(hn, &netAddr)); | 
| +    return isIPaddr; | 
| +} | 
| + | 
| /* | 
| ** Add a domain name to the list of names that the user has explicitly | 
| ** allowed (despite cert name mismatches) for use with a server cert. | 
| @@ -1880,7 +1889,17 @@ | 
|  | 
| cn = CERT_GetCommonName(&cert->subject); | 
| if ( cn ) { | 
| -	rv = cert_TestHostName(cn, hn); | 
| +        PRBool isIPaddr = cert_IsIPAddr(hn); | 
| +        if (isIPaddr) { | 
| +            if (PORT_Strcasecmp(hn, cn) == 0) { | 
| +                rv =  SECSuccess; | 
| +            } else { | 
| +                PORT_SetError(SSL_ERROR_BAD_CERT_DOMAIN); | 
| +                rv = SECFailure; | 
| +            } | 
| +        } else { | 
| +            rv = cert_TestHostName(cn, hn); | 
| +        } | 
| PORT_Free(cn); | 
| } else | 
| PORT_SetError(SSL_ERROR_BAD_CERT_DOMAIN); | 
| @@ -2110,7 +2129,7 @@ | 
| PORT_Free(nickname); | 
| } | 
|  | 
| -    nickname = ""; | 
| +    nickname = NULL; | 
|  | 
| done: | 
| if ( firstname ) { | 
|  |