Blame 0020-Allocate-pesign_context-rather-than-having-it-on-the.patch

18bcd8b
From 66d3353e6d24c9e69ce71735c5aa4741717a6d68 Mon Sep 17 00:00:00 2001
18bcd8b
From: Peter Jones <pjones@redhat.com>
18bcd8b
Date: Wed, 17 Oct 2012 15:31:15 -0400
11a11c6
Subject: [PATCH 20/42] Allocate pesign_context rather than having it on the
18bcd8b
 stack.
18bcd8b
18bcd8b
This way it won't try to re-initialize cms_context when it's cleaned up.
18bcd8b
18bcd8b
Signed-off-by: Peter Jones <pjones@redhat.com>
18bcd8b
---
18bcd8b
 src/pesign.c | 152 ++++++++++++++++++++++++++++++-----------------------------
18bcd8b
 1 file changed, 77 insertions(+), 75 deletions(-)
18bcd8b
18bcd8b
diff --git a/src/pesign.c b/src/pesign.c
18bcd8b
index 2ba5ef1..e22e814 100644
18bcd8b
--- a/src/pesign.c
18bcd8b
+++ b/src/pesign.c
18bcd8b
@@ -426,7 +426,7 @@ main(int argc, char *argv[])
18bcd8b
 {
18bcd8b
 	int rc;
18bcd8b
 
18bcd8b
-	pesign_context ctx, *ctxp = &ctx;
18bcd8b
+	pesign_context *ctxp;
18bcd8b
 
18bcd8b
 	int list = 0;
18bcd8b
 	int remove = 0;
18bcd8b
@@ -437,40 +437,47 @@ main(int argc, char *argv[])
18bcd8b
 	char *tokenname = "NSS Certificate DB";
18bcd8b
 	char *certname = NULL;
18bcd8b
 
18bcd8b
+	rc = pesign_context_new(&ctxp);
18bcd8b
+	if (rc < 0) {
18bcd8b
+		fprintf(stderr, "Could not initialize context: %m\n");
18bcd8b
+		exit(1);
18bcd8b
+	}
18bcd8b
+
18bcd8b
 	poptContext optCon;
18bcd8b
 	struct poptOption options[] = {
18bcd8b
 		{NULL, '\0', POPT_ARG_INTL_DOMAIN, "pesign" },
18bcd8b
-		{"in", 'i', POPT_ARG_STRING, &ctx.infile, 0,
18bcd8b
+		{"in", 'i', POPT_ARG_STRING, &ctxp->infile, 0,
18bcd8b
 			"specify input file", "<infile>"},
18bcd8b
-		{"out", 'o', POPT_ARG_STRING, &ctx.outfile, 0,
18bcd8b
+		{"out", 'o', POPT_ARG_STRING, &ctxp->outfile, 0,
18bcd8b
 			"specify output file", "<outfile>" },
18bcd8b
 		{"certficate", 'c', POPT_ARG_STRING, &certname, 0,
18bcd8b
 			"specify certificate nickname",
18bcd8b
 			"<certificate nickname>" },
18bcd8b
-		{"privkey", 'p', POPT_ARG_STRING, &ctx.privkeyfile, 0,
18bcd8b
+		{"privkey", 'p', POPT_ARG_STRING, &ctxp->privkeyfile, 0,
18bcd8b
 			"specify private key file", "<privkey>" },
18bcd8b
-		{"force", 'f', POPT_ARG_VAL, &ctx.force,  1,
18bcd8b
+		{"force", 'f', POPT_ARG_VAL, &ctxp->force,  1,
18bcd8b
 			"force overwriting of output file", NULL },
18bcd8b
-		{"sign", 's', POPT_ARG_VAL, &ctx.sign, 1,
18bcd8b
+		{"sign", 's', POPT_ARG_VAL, &ctxp->sign, 1,
18bcd8b
 			"create a new signature", NULL },
18bcd8b
-		{"hash", 'h', POPT_ARG_VAL, &ctx.hash, 1, "hash binary", NULL },
18bcd8b
+		{"hash", 'h', POPT_ARG_VAL, &ctxp->hash, 1, "hash binary", NULL },
18bcd8b
 		{"digest_type", 'd', POPT_ARG_STRING|POPT_ARGFLAG_SHOW_DEFAULT,
18bcd8b
 			&digest_name, 0, "digest type to use for pe hash" },
18bcd8b
 		{"import-signed-certificate", 'm',
18bcd8b
 			POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN,
18bcd8b
-			&ctx.insig, 0,"import signature from file", "<insig>" },
18bcd8b
+			&ctxp->insig, 0,"import signature from file", "<insig>" },
18bcd8b
 		{"export-signed-attributes", 'E',
18bcd8b
 			POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN,
18bcd8b
-			&ctx.outsattrs, 0, "export signed attributes to file",
18bcd8b
+			&ctxp->outsattrs, 0, "export signed attributes to file",
18bcd8b
 			"<signed_attributes_file>" },
18bcd8b
 		{"import-signed-attributes", 'I',
18bcd8b
 			POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN,
18bcd8b
-			&ctx.insattrs, 0, "import signed attributes from file",
18bcd8b
+			&ctxp->insattrs, 0,
18bcd8b
+			"import signed attributes from file",
18bcd8b
 			"<signed_attributes_file>" },
18bcd8b
 		{"import-raw-signature", 'R',
18bcd8b
-			POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &ctx.rawsig,
18bcd8b
+			POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN, &ctxp->rawsig,
18bcd8b
 			0, "import raw signature from file", "<inraw>" },
18bcd8b
-		{"signature-number", 'u', POPT_ARG_INT, &ctx.signum, -1,
18bcd8b
+		{"signature-number", 'u', POPT_ARG_INT, &ctxp->signum, -1,
18bcd8b
 			"specify which signature to operate on","<sig-number>"},
18bcd8b
 		{"list-signatures", 'l',
18bcd8b
 			POPT_ARG_VAL|POPT_ARGFLAG_DOC_HIDDEN,
18bcd8b
@@ -483,13 +490,14 @@ main(int argc, char *argv[])
18bcd8b
 			"remove signature" },
18bcd8b
 		{"export-signature", 'e',
18bcd8b
 			POPT_ARG_STRING|POPT_ARGFLAG_DOC_HIDDEN,
18bcd8b
-			&ctx.outsig, 0,"export signature to file", "<outsig>" },
18bcd8b
+			&ctxp->outsig, 0,
18bcd8b
+			"export signature to file", "<outsig>" },
18bcd8b
 		{"export-pubkey", 'K', POPT_ARG_STRING,
18bcd8b
-			&ctx.outkey, 0, "export pubkey to file", "<outkey>" },
18bcd8b
+			&ctxp->outkey, 0, "export pubkey to file", "<outkey>" },
18bcd8b
 		{"export-cert", 'C', POPT_ARG_STRING,
18bcd8b
-			&ctx.outcert, 0, "export signing cert to file",
18bcd8b
+			&ctxp->outcert, 0, "export signing cert to file",
18bcd8b
 			"<outcert>" },
18bcd8b
-		{"ascii-armor", 'a', POPT_ARG_VAL, &ctx.ascii, 1,
18bcd8b
+		{"ascii-armor", 'a', POPT_ARG_VAL, &ctxp->ascii, 1,
18bcd8b
 			"use ascii armoring", NULL },
18bcd8b
 		{"daemonize", 'D', POPT_ARG_VAL, &daemon, 1,
18bcd8b
 			"run as a daemon process", NULL },
18bcd8b
@@ -509,12 +517,6 @@ main(int argc, char *argv[])
18bcd8b
 		}
18bcd8b
 	}
18bcd8b
 
18bcd8b
-	rc = pesign_context_init(ctxp);
18bcd8b
-	if (rc < 0) {
18bcd8b
-		fprintf(stderr, "Could not initialize context: %m\n");
18bcd8b
-		exit(1);
18bcd8b
-	}
18bcd8b
-
18bcd8b
 	optCon = poptGetContext("pesign", argc, (const char **)argv, options,0);
18bcd8b
 
18bcd8b
 	rc = poptReadDefaultConfig(optCon, 0);
18bcd8b
@@ -571,25 +573,25 @@ main(int argc, char *argv[])
18bcd8b
 	if (daemon)
18bcd8b
 		action |= DAEMONIZE;
18bcd8b
 
18bcd8b
-	if (ctx.rawsig)
18bcd8b
+	if (ctxp->rawsig)
18bcd8b
 		action |= IMPORT_RAW_SIGNATURE;
18bcd8b
 
18bcd8b
-	if (ctx.insattrs)
18bcd8b
+	if (ctxp->insattrs)
18bcd8b
 		action |= IMPORT_SATTRS;
18bcd8b
 
18bcd8b
-	if (ctx.outsattrs)
18bcd8b
+	if (ctxp->outsattrs)
18bcd8b
 		action |= EXPORT_SATTRS;
18bcd8b
-		
18bcd8b
-	if (ctx.insig)
18bcd8b
+
18bcd8b
+	if (ctxp->insig)
18bcd8b
 		action |= IMPORT_SIGNATURE;
18bcd8b
 
18bcd8b
-	if (ctx.outkey)
18bcd8b
+	if (ctxp->outkey)
18bcd8b
 		action |= EXPORT_PUBKEY;
18bcd8b
 
18bcd8b
-	if (ctx.outcert)
18bcd8b
+	if (ctxp->outcert)
18bcd8b
 		action |= EXPORT_CERT;
18bcd8b
 
18bcd8b
-	if (ctx.outsig)
18bcd8b
+	if (ctxp->outsig)
18bcd8b
 		action |= EXPORT_SIGNATURE;
18bcd8b
 
18bcd8b
 	if (remove != 0)
18bcd8b
@@ -598,13 +600,13 @@ main(int argc, char *argv[])
18bcd8b
 	if (list != 0)
18bcd8b
 		action |= LIST_SIGNATURES;
18bcd8b
 
18bcd8b
-	if (ctx.sign) {
18bcd8b
+	if (ctxp->sign) {
18bcd8b
 		action |= GENERATE_SIGNATURE;
18bcd8b
 		if (!(action & EXPORT_SIGNATURE))
18bcd8b
 			action |= IMPORT_SIGNATURE;
18bcd8b
 	}
18bcd8b
 
18bcd8b
-	if (ctx.hash)
18bcd8b
+	if (ctxp->hash)
18bcd8b
 		action |= GENERATE_DIGEST|PRINT_DIGEST;
18bcd8b
 
18bcd8b
 	ssize_t sigspace = 0;
18bcd8b
@@ -620,11 +622,11 @@ main(int argc, char *argv[])
18bcd8b
 		 */
18bcd8b
 		case IMPORT_RAW_SIGNATURE|IMPORT_SATTRS:
18bcd8b
 			check_inputs(ctxp);
18bcd8b
-			rc = find_certificate(ctx.cms_ctx);
18bcd8b
+			rc = find_certificate(ctxp->cms_ctx);
18bcd8b
 			if (rc < 0) {
18bcd8b
 				fprintf(stderr, "pesign: Could not find "
18bcd8b
 					"certificate %s\n",
18bcd8b
-					ctx.cms_ctx->certname);
18bcd8b
+					ctxp->cms_ctx->certname);
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
 			open_rawsig_input(ctxp);
18bcd8b
@@ -636,19 +638,19 @@ main(int argc, char *argv[])
18bcd8b
 			open_input(ctxp);
18bcd8b
 			open_output(ctxp);
18bcd8b
 			close_input(ctxp);
18bcd8b
-			generate_digest(ctx.cms_ctx, ctx.outpe);
18bcd8b
-			sigspace = calculate_signature_space(ctx.cms_ctx,
18bcd8b
-								ctx.outpe);
18bcd8b
-			allocate_signature_space(ctx.outpe, sigspace);
18bcd8b
-			generate_signature(ctx.cms_ctx);
18bcd8b
-			insert_signature(ctx.cms_ctx, ctx.signum);
18bcd8b
-			finalize_signatures(ctx.cms_ctx, ctx.outpe);
18bcd8b
+			generate_digest(ctxp->cms_ctx, ctxp->outpe);
18bcd8b
+			sigspace = calculate_signature_space(ctxp->cms_ctx,
18bcd8b
+								ctxp->outpe);
18bcd8b
+			allocate_signature_space(ctxp->outpe, sigspace);
18bcd8b
+			generate_signature(ctxp->cms_ctx);
18bcd8b
+			insert_signature(ctxp->cms_ctx, ctxp->signum);
18bcd8b
+			finalize_signatures(ctxp->cms_ctx, ctxp->outpe);
18bcd8b
 			close_output(ctxp);
18bcd8b
 			break;
18bcd8b
 		case EXPORT_SATTRS:
18bcd8b
 			open_input(ctxp);
18bcd8b
 			open_sattr_output(ctxp);
18bcd8b
-			generate_digest(ctx.cms_ctx, ctx.inpe);
18bcd8b
+			generate_digest(ctxp->cms_ctx, ctxp->inpe);
18bcd8b
 			generate_sattr_blob(ctxp);
18bcd8b
 			close_sattr_output(ctxp);
18bcd8b
 			close_input(ctxp);
18bcd8b
@@ -666,22 +668,22 @@ main(int argc, char *argv[])
18bcd8b
 			close_output(ctxp);
18bcd8b
 			break;
18bcd8b
 		case EXPORT_PUBKEY:
18bcd8b
-			rc = find_certificate(ctx.cms_ctx);
18bcd8b
+			rc = find_certificate(ctxp->cms_ctx);
18bcd8b
 			if (rc < 0) {
18bcd8b
 				fprintf(stderr, "pesign: Could not find "
18bcd8b
 					"certificate %s\n",
18bcd8b
-					ctx.cms_ctx->certname);
18bcd8b
+					ctxp->cms_ctx->certname);
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
 			open_pubkey_output(ctxp);
18bcd8b
 			export_pubkey(ctxp);
18bcd8b
 			break;
18bcd8b
 		case EXPORT_CERT:
18bcd8b
-			rc = find_certificate(ctx.cms_ctx);
18bcd8b
+			rc = find_certificate(ctxp->cms_ctx);
18bcd8b
 			if (rc < 0) {
18bcd8b
 				fprintf(stderr, "pesign: Could not find "
18bcd8b
 					"certificate %s\n",
18bcd8b
-					ctx.cms_ctx->certname);
18bcd8b
+					ctxp->cms_ctx->certname);
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
 			open_cert_output(ctxp);
18bcd8b
@@ -691,21 +693,21 @@ main(int argc, char *argv[])
18bcd8b
 		case EXPORT_SIGNATURE:
18bcd8b
 			open_input(ctxp);
18bcd8b
 			open_sig_output(ctxp);
18bcd8b
-			if (ctx.signum > ctx.cms_ctx->num_signatures) {
18bcd8b
+			if (ctxp->signum > ctxp->cms_ctx->num_signatures) {
18bcd8b
 				fprintf(stderr, "Invalid signature number.\n");
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
-			if (ctx.signum < 0)
18bcd8b
-				ctx.signum = 0;
18bcd8b
-			if (ctx.signum >= ctx.cms_ctx->num_signatures) {
18bcd8b
+			if (ctxp->signum < 0)
18bcd8b
+				ctxp->signum = 0;
18bcd8b
+			if (ctxp->signum >= ctxp->cms_ctx->num_signatures) {
18bcd8b
 				fprintf(stderr, "No valid signature #%d.\n",
18bcd8b
-					ctx.signum);
18bcd8b
+					ctxp->signum);
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
-			memcpy(&ctx.cms_ctx->newsig,
18bcd8b
-				ctx.cms_ctx->signatures[ctx.signum],
18bcd8b
-				sizeof (ctx.cms_ctx->newsig));
18bcd8b
-			export_signature(ctx.cms_ctx, ctx.outsigfd, ctx.ascii);
18bcd8b
+			memcpy(&ctxp->cms_ctx->newsig,
18bcd8b
+				ctxp->cms_ctx->signatures[ctxp->signum],
18bcd8b
+				sizeof (ctxp->cms_ctx->newsig));
18bcd8b
+			export_signature(ctxp->cms_ctx, ctxp->outsigfd, ctxp->ascii);
18bcd8b
 			close_input(ctxp);
18bcd8b
 			close_sig_output(ctxp);
18bcd8b
 			break;
18bcd8b
@@ -715,11 +717,11 @@ main(int argc, char *argv[])
18bcd8b
 			open_input(ctxp);
18bcd8b
 			open_output(ctxp);
18bcd8b
 			close_input(ctxp);
18bcd8b
-			if (ctx.signum > ctx.cms_ctx->num_signatures) {
18bcd8b
+			if (ctxp->signum > ctxp->cms_ctx->num_signatures) {
18bcd8b
 				fprintf(stderr, "Invalid signature number.\n");
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
-			remove_signature(&ctx;;
18bcd8b
+			remove_signature(ctxp);
18bcd8b
 			close_output(ctxp);
18bcd8b
 			break;
18bcd8b
 		/* list signatures in the binary */
18bcd8b
@@ -729,49 +731,49 @@ main(int argc, char *argv[])
18bcd8b
 			break;
18bcd8b
 		case GENERATE_DIGEST|PRINT_DIGEST:
18bcd8b
 			open_input(ctxp);
18bcd8b
-			generate_digest(ctx.cms_ctx, ctx.inpe);
18bcd8b
+			generate_digest(ctxp->cms_ctx, ctxp->inpe);
18bcd8b
 			print_digest(ctxp);
18bcd8b
 			break;
18bcd8b
 		/* generate a signature and save it in a separate file */
18bcd8b
 		case EXPORT_SIGNATURE|GENERATE_SIGNATURE:
18bcd8b
-			rc = find_certificate(ctx.cms_ctx);
18bcd8b
+			rc = find_certificate(ctxp->cms_ctx);
18bcd8b
 			if (rc < 0) {
18bcd8b
 				fprintf(stderr, "pesign: Could not find "
18bcd8b
 					"certificate %s\n",
18bcd8b
-					ctx.cms_ctx->certname);
18bcd8b
+					ctxp->cms_ctx->certname);
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
 			open_input(ctxp);
18bcd8b
 			open_sig_output(ctxp);
18bcd8b
-			generate_digest(ctx.cms_ctx, ctx.inpe);
18bcd8b
-			generate_signature(ctx.cms_ctx);
18bcd8b
-			export_signature(ctx.cms_ctx, ctx.outsigfd, ctx.ascii);
18bcd8b
+			generate_digest(ctxp->cms_ctx, ctxp->inpe);
18bcd8b
+			generate_signature(ctxp->cms_ctx);
18bcd8b
+			export_signature(ctxp->cms_ctx, ctxp->outsigfd, ctxp->ascii);
18bcd8b
 			break;
18bcd8b
 		/* generate a signature and embed it in the binary */
18bcd8b
 		case IMPORT_SIGNATURE|GENERATE_SIGNATURE:
18bcd8b
 			check_inputs(ctxp);
18bcd8b
-			rc = find_certificate(ctx.cms_ctx);
18bcd8b
+			rc = find_certificate(ctxp->cms_ctx);
18bcd8b
 			if (rc < 0) {
18bcd8b
 				fprintf(stderr, "pesign: Could not find "
18bcd8b
 					"certificate %s\n",
18bcd8b
-					ctx.cms_ctx->certname);
18bcd8b
+					ctxp->cms_ctx->certname);
18bcd8b
 				exit(1);
18bcd8b
 			}
18bcd8b
 			open_input(ctxp);
18bcd8b
 			open_output(ctxp);
18bcd8b
 			close_input(ctxp);
18bcd8b
-			generate_digest(ctx.cms_ctx, ctx.outpe);
18bcd8b
-			sigspace = calculate_signature_space(ctx.cms_ctx,
18bcd8b
-							     ctx.outpe);
18bcd8b
-			allocate_signature_space(ctx.outpe, sigspace);
18bcd8b
-			generate_digest(ctx.cms_ctx, ctx.outpe);
18bcd8b
-			generate_signature(ctx.cms_ctx);
18bcd8b
-			insert_signature(ctx.cms_ctx, ctx.signum);
18bcd8b
-			finalize_signatures(ctx.cms_ctx, ctx.outpe);
18bcd8b
+			generate_digest(ctxp->cms_ctx, ctxp->outpe);
18bcd8b
+			sigspace = calculate_signature_space(ctxp->cms_ctx,
18bcd8b
+							     ctxp->outpe);
18bcd8b
+			allocate_signature_space(ctxp->outpe, sigspace);
18bcd8b
+			generate_digest(ctxp->cms_ctx, ctxp->outpe);
18bcd8b
+			generate_signature(ctxp->cms_ctx);
18bcd8b
+			insert_signature(ctxp->cms_ctx, ctxp->signum);
18bcd8b
+			finalize_signatures(ctxp->cms_ctx, ctxp->outpe);
18bcd8b
 			close_output(ctxp);
18bcd8b
 			break;
18bcd8b
 		case DAEMONIZE:
18bcd8b
-			rc = daemonize(ctx.cms_ctx, fork);
18bcd8b
+			rc = daemonize(ctxp->cms_ctx, fork);
18bcd8b
 			break;
18bcd8b
 		default:
18bcd8b
 			fprintf(stderr, "Incompatible flags (0x%08x): ", action);
18bcd8b
@@ -782,7 +784,7 @@ main(int argc, char *argv[])
18bcd8b
 			fprintf(stderr, "\n");
18bcd8b
 			exit(1);
18bcd8b
 	}
18bcd8b
-	pesign_context_fini(&ctx;;
18bcd8b
+	pesign_context_free(ctxp);
18bcd8b
 
18bcd8b
 	NSS_Shutdown();
18bcd8b
 	return (rc < 0);
18bcd8b
-- 
18bcd8b
1.7.12.1
18bcd8b