summaryrefslogtreecommitdiff
path: root/nss/lib/cryptohi/dsautil.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-08 10:53:01 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-08 10:53:01 +0000
commitf95d45c36e7c7131747259956821d844e8952e5d (patch)
treeeee14f8b212c48f8597c2a4927a167fcc3a15ea5 /nss/lib/cryptohi/dsautil.c
parentdc1565216a5d20ae0d75872151523252309a1292 (diff)
downloadnss-master.tar.gz
Diffstat (limited to 'nss/lib/cryptohi/dsautil.c')
-rw-r--r--nss/lib/cryptohi/dsautil.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/nss/lib/cryptohi/dsautil.c b/nss/lib/cryptohi/dsautil.c
index db397df..df4d9a9 100644
--- a/nss/lib/cryptohi/dsautil.c
+++ b/nss/lib/cryptohi/dsautil.c
@@ -166,12 +166,16 @@ static SECItem *
common_DecodeDerSig(const SECItem *item, unsigned int len)
{
SECItem *result = NULL;
+ PORTCheapArenaPool arena;
SECStatus status;
DSA_ASN1Signature sig;
SECItem dst;
PORT_Memset(&sig, 0, sizeof(sig));
+ /* Make enough room for r + s. */
+ PORT_InitCheapArena(&arena, PR_MAX(2 * MAX_ECKEY_LEN, DSA_MAX_SIGNATURE_LEN));
+
result = PORT_ZNew(SECItem);
if (result == NULL)
goto loser;
@@ -183,7 +187,7 @@ common_DecodeDerSig(const SECItem *item, unsigned int len)
sig.r.type = siUnsignedInteger;
sig.s.type = siUnsignedInteger;
- status = SEC_ASN1DecodeItem(NULL, &sig, DSA_SignatureTemplate, item);
+ status = SEC_QuickDERDecodeItem(&arena.arena, &sig, DSA_SignatureTemplate, item);
if (status != SECSuccess)
goto loser;
@@ -202,10 +206,7 @@ common_DecodeDerSig(const SECItem *item, unsigned int len)
goto loser;
done:
- if (sig.r.data != NULL)
- PORT_Free(sig.r.data);
- if (sig.s.data != NULL)
- PORT_Free(sig.s.data);
+ PORT_DestroyCheapArena(&arena);
return result;