summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorFranziskus Kiefer <franziskuskiefer@gmail.com>2016-10-04 15:55:00 +0200
committerFranziskus Kiefer <franziskuskiefer@gmail.com>2016-10-04 15:55:00 +0200
commitaf64311eacbef57a2de2d241173c0f1ac695f887 (patch)
treea78366e7a4c64227e91e63f263c5293b500daa2a /cmd
parent0257bd3a2061a52dc0d2104059a134e43202cfa7 (diff)
downloadnss-hg-af64311eacbef57a2de2d241173c0f1ac695f887.tar.gz
Bug 1307531 - fix derdump leaks, r=ttaubert
Diffstat (limited to 'cmd')
-rw-r--r--cmd/derdump/derdump.c35
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;
}