dcavalca / rpms / rpm

Forked from rpms/rpm a year ago
Clone
James Antill ee2eaf
diff -up rpm-4.14.3/sign/rpmgensig.c.orig rpm-4.14.3/sign/rpmgensig.c
James Antill ee2eaf
--- rpm-4.14.3/sign/rpmgensig.c.orig	2020-06-26 15:57:43.781333983 +0200
James Antill ee2eaf
+++ rpm-4.14.3/sign/rpmgensig.c	2020-06-26 15:58:29.819229616 +0200
James Antill ee2eaf
@@ -8,7 +8,6 @@
James Antill ee2eaf
 #include <errno.h>
James Antill ee2eaf
 #include <sys/wait.h>
James Antill ee2eaf
 #include <popt.h>
James Antill ee2eaf
-#include <libgen.h>
James Antill ee2eaf
 
James Antill ee2eaf
 #include <rpm/rpmlib.h>			/* RPMSIGTAG & related */
James Antill ee2eaf
 #include <rpm/rpmmacro.h>
James Antill ee2eaf
@@ -33,68 +32,6 @@ typedef struct sigTarget_s {
James Antill ee2eaf
     rpm_loff_t size;
James Antill ee2eaf
 } *sigTarget;
James Antill ee2eaf
 
James Antill ee2eaf
-/*
James Antill ee2eaf
- * There is no function for creating unique temporary fifos so create
James Antill ee2eaf
- * unique temporary directory and then create fifo in it.
James Antill ee2eaf
- */
James Antill ee2eaf
-static char *mkTempFifo(void)
James Antill ee2eaf
-{
James Antill ee2eaf
-    char *tmppath = NULL, *tmpdir = NULL, *fifofn = NULL;
James Antill ee2eaf
-    mode_t mode;
James Antill ee2eaf
-
James Antill ee2eaf
-    tmppath = rpmExpand("%{_tmppath}", NULL);
James Antill ee2eaf
-    if (rpmioMkpath(tmppath, 0755, (uid_t) -1, (gid_t) -1))
James Antill ee2eaf
-	goto exit;
James Antill ee2eaf
-
James Antill ee2eaf
-
James Antill ee2eaf
-    tmpdir = rpmGetPath(tmppath, "/rpm-tmp.XXXXXX", NULL);
James Antill ee2eaf
-    mode = umask(0077);
James Antill ee2eaf
-    tmpdir = mkdtemp(tmpdir);
James Antill ee2eaf
-    umask(mode);
James Antill ee2eaf
-    if (tmpdir == NULL) {
James Antill ee2eaf
-	rpmlog(RPMLOG_ERR, _("error creating temp directory %s: %m\n"),
James Antill ee2eaf
-	    tmpdir);
James Antill ee2eaf
-	tmpdir = _free(tmpdir);
James Antill ee2eaf
-	goto exit;
James Antill ee2eaf
-    }
James Antill ee2eaf
-
James Antill ee2eaf
-    fifofn = rpmGetPath(tmpdir, "/fifo", NULL);
James Antill ee2eaf
-    if (mkfifo(fifofn, 0600) == -1) {
James Antill ee2eaf
-	rpmlog(RPMLOG_ERR, _("error creating fifo %s: %m\n"), fifofn);
James Antill ee2eaf
-	fifofn = _free(fifofn);
James Antill ee2eaf
-    }
James Antill ee2eaf
-
James Antill ee2eaf
-exit:
James Antill ee2eaf
-    if (fifofn == NULL && tmpdir != NULL)
James Antill ee2eaf
-	unlink(tmpdir);
James Antill ee2eaf
-
James Antill ee2eaf
-    free(tmppath);
James Antill ee2eaf
-    free(tmpdir);
James Antill ee2eaf
-
James Antill ee2eaf
-    return fifofn;
James Antill ee2eaf
-}
James Antill ee2eaf
-
James Antill ee2eaf
-/* Delete fifo and then temporary directory in which it was located */
James Antill ee2eaf
-static int rpmRmTempFifo(const char *fn)
James Antill ee2eaf
-{
James Antill ee2eaf
-    int rc = 0;
James Antill ee2eaf
-    char *dfn = NULL, *dir = NULL;
James Antill ee2eaf
-
James Antill ee2eaf
-    if ((rc = unlink(fn)) != 0) {
James Antill ee2eaf
-	rpmlog(RPMLOG_ERR, _("error delete fifo %s: %m\n"), fn);
James Antill ee2eaf
-	return rc;
James Antill ee2eaf
-    }
James Antill ee2eaf
-
James Antill ee2eaf
-    dfn = xstrdup(fn);
James Antill ee2eaf
-    dir = dirname(dfn);
James Antill ee2eaf
-
James Antill ee2eaf
-    if ((rc = rmdir(dir)) != 0)
James Antill ee2eaf
-	rpmlog(RPMLOG_ERR, _("error delete directory %s: %m\n"), dir);
James Antill ee2eaf
-    free(dfn);
James Antill ee2eaf
-
James Antill ee2eaf
-    return rc;
James Antill ee2eaf
-}
James Antill ee2eaf
-
James Antill ee2eaf
 static int closeFile(FD_t *fdp)
James Antill ee2eaf
 {
James Antill ee2eaf
     if (fdp == NULL || *fdp == NULL)
James Antill ee2eaf
@@ -241,27 +178,38 @@ exit:
James Antill ee2eaf
 static int runGPG(sigTarget sigt, const char *sigfile)
James Antill ee2eaf
 {
James Antill ee2eaf
     int pid = 0, status;
James Antill ee2eaf
-    FD_t fnamedPipe = NULL;
James Antill ee2eaf
-    char *namedPipeName = NULL;
James Antill ee2eaf
+    int pipefd[2];
James Antill ee2eaf
+    FILE *fpipe = NULL;
James Antill ee2eaf
     unsigned char buf[BUFSIZ];
James Antill ee2eaf
     ssize_t count;
James Antill ee2eaf
     ssize_t wantCount;
James Antill ee2eaf
     rpm_loff_t size;
James Antill ee2eaf
     int rc = 1; /* assume failure */
James Antill ee2eaf
 
James Antill ee2eaf
-    namedPipeName = mkTempFifo();
James Antill ee2eaf
+    if (pipe(pipefd) < 0) {
James Antill ee2eaf
+        rpmlog(RPMLOG_ERR, _("Could not create pipe for signing: %m\n"));
James Antill ee2eaf
+        goto exit;
James Antill ee2eaf
+    }
James Antill ee2eaf
 
James Antill ee2eaf
-    rpmPushMacro(NULL, "__plaintext_filename", NULL, namedPipeName, -1);
James Antill ee2eaf
+    rpmPushMacro(NULL, "__plaintext_filename", NULL, "-", -1);
James Antill ee2eaf
     rpmPushMacro(NULL, "__signature_filename", NULL, sigfile, -1);
James Antill ee2eaf
 
James Antill ee2eaf
     if (!(pid = fork())) {
James Antill ee2eaf
 	char *const *av;
James Antill ee2eaf
 	char *cmd = NULL;
James Antill ee2eaf
-	const char *gpg_path = rpmExpand("%{?_gpg_path}", NULL);
James Antill ee2eaf
+	const char *tty = ttyname(STDIN_FILENO);
James Antill ee2eaf
+	const char *gpg_path = NULL;
James Antill ee2eaf
+
James Antill ee2eaf
+	if (!getenv("GPG_TTY") && (!tty || setenv("GPG_TTY", tty, 0)))
James Antill ee2eaf
+	    rpmlog(RPMLOG_WARNING, _("Could not set GPG_TTY to stdin: %m\n"));
James Antill ee2eaf
 
James Antill ee2eaf
+	gpg_path = rpmExpand("%{?_gpg_path}", NULL);
James Antill ee2eaf
 	if (gpg_path && *gpg_path != '\0')
James Antill ee2eaf
 	    (void) setenv("GNUPGHOME", gpg_path, 1);
James Antill ee2eaf
 
James Antill ee2eaf
+	dup2(pipefd[0], STDIN_FILENO);
James Antill ee2eaf
+	close(pipefd[1]);
James Antill ee2eaf
+
James Antill ee2eaf
 	unsetenv("MALLOC_CHECK_");
James Antill ee2eaf
 	cmd = rpmExpand("%{?__gpg_sign_cmd}", NULL);
James Antill ee2eaf
 	rc = poptParseArgvString(cmd, NULL, (const char ***)&av;;
James Antill ee2eaf
@@ -276,9 +224,10 @@ static int runGPG(sigTarget sigt, const
James Antill ee2eaf
     rpmPopMacro(NULL, "__plaintext_filename");
James Antill ee2eaf
     rpmPopMacro(NULL, "__signature_filename");
James Antill ee2eaf
 
James Antill ee2eaf
-    fnamedPipe = Fopen(namedPipeName, "w");
James Antill ee2eaf
-    if (!fnamedPipe) {
James Antill ee2eaf
-	rpmlog(RPMLOG_ERR, _("Fopen failed\n"));
James Antill ee2eaf
+    close(pipefd[0]);
James Antill ee2eaf
+    fpipe = fdopen(pipefd[1], "w");
James Antill ee2eaf
+    if (!fpipe) {
James Antill ee2eaf
+	rpmlog(RPMLOG_ERR, _("Could not open pipe for writing: %m\n"));
James Antill ee2eaf
 	goto exit;
James Antill ee2eaf
     }
James Antill ee2eaf
 
James Antill ee2eaf
@@ -291,8 +240,8 @@ static int runGPG(sigTarget sigt, const
James Antill ee2eaf
     size = sigt->size;
James Antill ee2eaf
     wantCount = size < sizeof(buf) ? size : sizeof(buf);
James Antill ee2eaf
     while ((count = Fread(buf, sizeof(buf[0]), wantCount, sigt->fd)) > 0) {
James Antill ee2eaf
-	Fwrite(buf, sizeof(buf[0]), count, fnamedPipe);
James Antill ee2eaf
-	if (Ferror(fnamedPipe)) {
James Antill ee2eaf
+	fwrite(buf, sizeof(buf[0]), count, fpipe);
James Antill ee2eaf
+	if (ferror(fpipe)) {
James Antill ee2eaf
 	    rpmlog(RPMLOG_ERR, _("Could not write to pipe\n"));
James Antill ee2eaf
 	    goto exit;
James Antill ee2eaf
 	}
James Antill ee2eaf
@@ -304,8 +253,13 @@ static int runGPG(sigTarget sigt, const
James Antill ee2eaf
 		sigt->fileName, Fstrerror(sigt->fd));
James Antill ee2eaf
 	goto exit;
James Antill ee2eaf
     }
James Antill ee2eaf
-    Fclose(fnamedPipe);
James Antill ee2eaf
-    fnamedPipe = NULL;
James Antill ee2eaf
+
James Antill ee2eaf
+exit:
James Antill ee2eaf
+
James Antill ee2eaf
+    if (fpipe)
James Antill ee2eaf
+	fclose(fpipe);
James Antill ee2eaf
+    if (pipefd[1])
James Antill ee2eaf
+	close(pipefd[1]);
James Antill ee2eaf
 
James Antill ee2eaf
     (void) waitpid(pid, &status, 0);
James Antill ee2eaf
     pid = 0;
James Antill ee2eaf
@@ -314,20 +268,6 @@ static int runGPG(sigTarget sigt, const
James Antill ee2eaf
     } else {
James Antill ee2eaf
 	rc = 0;
James Antill ee2eaf
     }
James Antill ee2eaf
-
James Antill ee2eaf
-exit:
James Antill ee2eaf
-
James Antill ee2eaf
-    if (fnamedPipe)
James Antill ee2eaf
-	Fclose(fnamedPipe);
James Antill ee2eaf
-
James Antill ee2eaf
-    if (pid)
James Antill ee2eaf
-	waitpid(pid, &status, 0);
James Antill ee2eaf
-
James Antill ee2eaf
-    if (namedPipeName) {
James Antill ee2eaf
-	rpmRmTempFifo(namedPipeName);
James Antill ee2eaf
-	free(namedPipeName);
James Antill ee2eaf
-    }
James Antill ee2eaf
-
James Antill ee2eaf
     return rc;
James Antill ee2eaf
 }
James Antill ee2eaf