diff options
Diffstat (limited to 'security/nss/lib/util/secdig.c')
-rw-r--r-- | security/nss/lib/util/secdig.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/security/nss/lib/util/secdig.c b/security/nss/lib/util/secdig.c index 263c8030f..07c136a74 100644 --- a/security/nss/lib/util/secdig.c +++ b/security/nss/lib/util/secdig.c @@ -166,21 +166,26 @@ SGN_DecodeDigestInfo(SECItem *didata) PRArenaPool *arena; SGNDigestInfo *di; SECStatus rv = SECFailure; + SECItem diCopy = {siBuffer, NULL, 0}; arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE); if(arena == NULL) return NULL; + rv = SECITEM_CopyItem(arena, &diCopy, didata); + if (rv != SECSuccess) { + PORT_FreeArena(arena, PR_FALSE); + return NULL; + } + di = (SGNDigestInfo *)PORT_ArenaZAlloc(arena, sizeof(SGNDigestInfo)); - if(di != NULL) - { + if (di != NULL) { di->arena = arena; - rv = SEC_ASN1DecodeItem(arena, di, sgn_DigestInfoTemplate, didata); + rv = SEC_QuickDERDecodeItem(arena, di, sgn_DigestInfoTemplate, &diCopy); } - if((di == NULL) || (rv != SECSuccess)) - { - PORT_FreeArena(arena, PR_TRUE); + if ((di == NULL) || (rv != SECSuccess)) { + PORT_FreeArena(arena, PR_FALSE); di = NULL; } |