diff options
author | Franziskus Kiefer <franziskuskiefer@gmail.com> | 2016-10-04 15:55:00 +0200 |
---|---|---|
committer | Franziskus Kiefer <franziskuskiefer@gmail.com> | 2016-10-04 15:55:00 +0200 |
commit | af64311eacbef57a2de2d241173c0f1ac695f887 (patch) | |
tree | a78366e7a4c64227e91e63f263c5293b500daa2a /cmd | |
parent | 0257bd3a2061a52dc0d2104059a134e43202cfa7 (diff) | |
download | nss-hg-af64311eacbef57a2de2d241173c0f1ac695f887.tar.gz |
Bug 1307531 - fix derdump leaks, r=ttaubert
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/derdump/derdump.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/cmd/derdump/derdump.c b/cmd/derdump/derdump.c index 2916be6a5..d687a8b7a 100644 --- a/cmd/derdump/derdump.c +++ b/cmd/derdump/derdump.c @@ -34,12 +34,13 @@ main(int argc, char **argv) char *progName; FILE *outFile; PRFileDesc *inFile; - SECItem der; + SECItem der = { siBuffer, NULL, 0 }; SECStatus rv; PRInt16 xp_error; PRBool raw = PR_FALSE; PLOptState *optstate; PLOptStatus status; + int retval = -1; progName = strrchr(argv[0], '/'); progName = progName ? progName + 1 : argv[0]; @@ -55,7 +56,7 @@ main(int argc, char **argv) if (!inFile) { fprintf(stderr, "%s: unable to open \"%s\" for reading\n", progName, optstate->value); - return -1; + goto cleanup; } break; @@ -64,7 +65,7 @@ main(int argc, char **argv) if (!outFile) { fprintf(stderr, "%s: unable to open \"%s\" for writing\n", progName, optstate->value); - return -1; + goto cleanup; } break; @@ -85,17 +86,19 @@ main(int argc, char **argv) if (!outFile) outFile = stdout; - rv = NSS_NoDB_Init(NULL); /* XXX */ + rv = NSS_NoDB_Init(NULL); if (rv != SECSuccess) { SECU_PrintPRandOSError(progName); - return -1; + goto cleanup; } rv = SECU_ReadDERFromFile(&der, inFile, PR_FALSE, PR_FALSE); if (rv == SECSuccess) { rv = DER_PrettyPrint(outFile, &der, raw); - if (rv == SECSuccess) - return 0; + if (rv == SECSuccess) { + retval = 0; + goto cleanup; + } } xp_error = PORT_GetError(); @@ -105,5 +108,21 @@ main(int argc, char **argv) if (errno) { SECU_PrintSystemError(progName, "errno=%d", errno); } - return 1; + retval = 1; + +cleanup: + retval |= NSS_Shutdown(); + if (inFile) { + PR_Close(inFile); + } + if (outFile) { + fflush(outFile); + fclose(outFile); + } + PL_DestroyOptState(optstate); + if (der.data) { + PORT_Free(der.data); + } + + return retval; } |