Index: mozilla/security/nss/lib/certdb/xauthkid.c =================================================================== RCS file: /cvsroot/mozilla/security/nss/lib/certdb/xauthkid.c,v retrieving revision 1.4 diff -pu -r1.4 mozilla/security/nss/lib/certdb/xauthkid.c --- mozilla/security/nss/lib/certdb/xauthkid.c +++ mozilla/security/nss/lib/certdb/xauthkid.c @@ -55,11 +55,11 @@ const SEC_ASN1Template CERTAuthKeyIDTemplate[] = { { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CERTAuthKeyID) }, { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | 0, - offsetof(CERTAuthKeyID,keyID), SEC_OctetStringTemplate}, + offsetof(CERTAuthKeyID,keyID), SEC_OctetStringTemplate}, { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC | 1, offsetof(CERTAuthKeyID, DERAuthCertIssuer), CERT_GeneralNamesTemplate}, { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | 2, - offsetof(CERTAuthKeyID,authCertSerialNumber), SEC_IntegerTemplate}, + offsetof(CERTAuthKeyID,authCertSerialNumber), SEC_IntegerTemplate}, { 0 } }; @@ -75,33 +75,33 @@ SECStatus CERT_EncodeAuthKeyID (PRArenaP PORT_Assert (encodedValue); do { - - /* If both of the authCertIssuer and the serial number exist, encode - the name first. Otherwise, it is an error if one exist and the other - is not. - */ - if (value->authCertIssuer) { - if (!value->authCertSerialNumber.data) { - PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); - break; - } - - value->DERAuthCertIssuer = cert_EncodeGeneralNames - (arena, value->authCertIssuer); - if (!value->DERAuthCertIssuer) { - PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); - break; - } - } - else if (value->authCertSerialNumber.data) { - PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); - break; - } - - if (SEC_ASN1EncodeItem (arena, encodedValue, value, - CERTAuthKeyIDTemplate) == NULL) - break; - rv = SECSuccess; + + /* If both of the authCertIssuer and the serial number exist, encode + the name first. Otherwise, it is an error if one exist and the other + is not. + */ + if (value->authCertIssuer) { + if (!value->authCertSerialNumber.data) { + PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); + break; + } + + value->DERAuthCertIssuer = cert_EncodeGeneralNames + (arena, value->authCertIssuer); + if (!value->DERAuthCertIssuer) { + PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); + break; + } + } + else if (value->authCertSerialNumber.data) { + PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); + break; + } + + if (SEC_ASN1EncodeItem (arena, encodedValue, value, + CERTAuthKeyIDTemplate) == NULL) + break; + rv = SECSuccess; } while (0); return(rv); @@ -118,40 +118,41 @@ CERT_DecodeAuthKeyID (PRArenaPool *arena PORT_Assert (arena); do { - mark = PORT_ArenaMark (arena); + mark = PORT_ArenaMark (arena); value = (CERTAuthKeyID*)PORT_ArenaZAlloc (arena, sizeof (*value)); - value->DERAuthCertIssuer = NULL; - if (value == NULL) - break; + if (value == NULL) + break; + + value->DERAuthCertIssuer = NULL; /* copy the DER into the arena, since Quick DER returns data that points into the DER input, which may get freed by the caller */ rv = SECITEM_CopyItem(arena, &newEncodedValue, encodedValue); if ( rv != SECSuccess ) { - break; + break; } rv = SEC_QuickDERDecodeItem - (arena, value, CERTAuthKeyIDTemplate, &newEncodedValue); - if (rv != SECSuccess) - break; + (arena, value, CERTAuthKeyIDTemplate, &newEncodedValue); + if (rv != SECSuccess) + break; value->authCertIssuer = cert_DecodeGeneralNames (arena, value->DERAuthCertIssuer); - if (value->authCertIssuer == NULL) - break; - - /* what if the general name contains other format but not URI ? - hl - */ - if ((value->authCertSerialNumber.data && !value->authCertIssuer) || - (!value->authCertSerialNumber.data && value->authCertIssuer)){ - PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); - break; - } + if (value->authCertIssuer == NULL) + break; + + /* what if the general name contains other format but not URI ? + hl + */ + if ((value->authCertSerialNumber.data && !value->authCertIssuer) || + (!value->authCertSerialNumber.data && value->authCertIssuer)){ + PORT_SetError (SEC_ERROR_EXTENSION_VALUE_INVALID); + break; + } } while (0); if (rv != SECSuccess) { - PORT_ArenaRelease (arena, mark); - return ((CERTAuthKeyID *)NULL); + PORT_ArenaRelease (arena, mark); + return ((CERTAuthKeyID *)NULL); } PORT_ArenaUnmark(arena, mark); return (value);