c7a072acc0
Add new rpmsign-sequoia and rpmsign-gnupg subpackages which can be used to switch between the two OpenPGP implementations for signing, rpm-sign-libs just requires one of them to be present. It's worth noting that unlike GnuPG, Sequoia doesn't accept names or email addresses as the signer identifier, one needs to supply the actual key fingerprint. Resolves: RHEL-56363
144 lines
4.0 KiB
Diff
144 lines
4.0 KiB
Diff
From 3b0a150af79668052bf5842b68341adbde016005 Mon Sep 17 00:00:00 2001
|
|
Message-ID: <3b0a150af79668052bf5842b68341adbde016005.1728896192.git.pmatilai@redhat.com>
|
|
From: Panu Matilainen <pmatilai@redhat.com>
|
|
Date: Thu, 5 Sep 2024 09:07:26 +0300
|
|
Subject: [PATCH 1/3] Refactor sign command expand and parse out of runGPG()
|
|
|
|
We'll need the wider visibility of the executing command for the next
|
|
steps. While at it, ensure the parsed signing command is minimally
|
|
sufficient for what the code expects, ie has at least two items in
|
|
the array.
|
|
|
|
We now need two exit points, one for the case where we forked and one
|
|
where we didn't. Also the case where waitpid() failed entirely must
|
|
not return directly to avoid leaking, so merge it with the rest of
|
|
the error handling if instead.
|
|
|
|
(cherry picked from commit 2c9ad2bbc1d00010880076cd5c73e97ffcb946ed)
|
|
---
|
|
sign/rpmgensig.c | 51 ++++++++++++++++++++++++++++++----------------
|
|
tests/rpmsigdig.at | 8 ++++++++
|
|
2 files changed, 42 insertions(+), 17 deletions(-)
|
|
|
|
diff --git a/sign/rpmgensig.c b/sign/rpmgensig.c
|
|
index a9c3c3e06..7bbd63216 100644
|
|
--- a/sign/rpmgensig.c
|
|
+++ b/sign/rpmgensig.c
|
|
@@ -188,6 +188,29 @@ exit:
|
|
return sigtd;
|
|
}
|
|
|
|
+char ** signCmd(const char *sigfile)
|
|
+{
|
|
+ int argc = 0;
|
|
+ char **argv = NULL;
|
|
+
|
|
+ rpmPushMacro(NULL, "__plaintext_filename", NULL, "-", -1);
|
|
+ rpmPushMacro(NULL, "__signature_filename", NULL, sigfile, -1);
|
|
+
|
|
+ char *cmd = rpmExpand("%{?__gpg_sign_cmd}", NULL);
|
|
+
|
|
+ rpmPopMacro(NULL, "__plaintext_filename");
|
|
+ rpmPopMacro(NULL, "__signature_filename");
|
|
+
|
|
+ if (poptParseArgvString(cmd, &argc, (const char ***)&argv) < 0 || argc < 2) {
|
|
+ rpmlog(RPMLOG_ERR, _("Invalid sign command: %s\n"), cmd);
|
|
+ argv = _free(argv);
|
|
+ }
|
|
+
|
|
+ free(cmd);
|
|
+
|
|
+ return argv;
|
|
+}
|
|
+
|
|
static int runGPG(sigTarget sigt, const char *sigfile)
|
|
{
|
|
int pid = 0, status;
|
|
@@ -198,18 +221,17 @@ static int runGPG(sigTarget sigt, const char *sigfile)
|
|
ssize_t wantCount;
|
|
rpm_loff_t size;
|
|
int rc = 1; /* assume failure */
|
|
+ char **argv = NULL;
|
|
+
|
|
+ if ((argv = signCmd(sigfile)) == NULL)
|
|
+ goto exit_nowait;
|
|
|
|
if (pipe(pipefd) < 0) {
|
|
rpmlog(RPMLOG_ERR, _("Could not create pipe for signing: %m\n"));
|
|
- goto exit;
|
|
+ goto exit_nowait;
|
|
}
|
|
|
|
- rpmPushMacro(NULL, "__plaintext_filename", NULL, "-", -1);
|
|
- rpmPushMacro(NULL, "__signature_filename", NULL, sigfile, -1);
|
|
-
|
|
if (!(pid = fork())) {
|
|
- char *const *av;
|
|
- char *cmd = NULL;
|
|
const char *tty = ttyname(STDIN_FILENO);
|
|
const char *gpg_path = NULL;
|
|
|
|
@@ -223,19 +245,13 @@ static int runGPG(sigTarget sigt, const char *sigfile)
|
|
dup2(pipefd[0], STDIN_FILENO);
|
|
close(pipefd[1]);
|
|
|
|
- cmd = rpmExpand("%{?__gpg_sign_cmd}", NULL);
|
|
- rc = poptParseArgvString(cmd, NULL, (const char ***)&av);
|
|
- if (!rc)
|
|
- rc = execve(av[0], av+1, environ);
|
|
+ rc = execve(argv[0], argv+1, environ);
|
|
|
|
rpmlog(RPMLOG_ERR, _("Could not exec %s: %s\n"), "gpg",
|
|
strerror(errno));
|
|
_exit(EXIT_FAILURE);
|
|
}
|
|
|
|
- rpmPopMacro(NULL, "__plaintext_filename");
|
|
- rpmPopMacro(NULL, "__signature_filename");
|
|
-
|
|
close(pipefd[0]);
|
|
fpipe = fdopen(pipefd[1], "w");
|
|
if (!fpipe) {
|
|
@@ -280,14 +296,15 @@ exit:
|
|
|
|
if (reaped == -1) {
|
|
rpmlog(RPMLOG_ERR, _("gpg waitpid failed (%s)\n"), strerror(errno));
|
|
- return rc;
|
|
- }
|
|
-
|
|
- if (!WIFEXITED(status) || WEXITSTATUS(status)) {
|
|
+ } else if (!WIFEXITED(status) || WEXITSTATUS(status)) {
|
|
rpmlog(RPMLOG_ERR, _("gpg exec failed (%d)\n"), WEXITSTATUS(status));
|
|
} else {
|
|
rc = 0;
|
|
}
|
|
+
|
|
+exit_nowait:
|
|
+ free(argv);
|
|
+
|
|
return rc;
|
|
}
|
|
|
|
diff --git a/tests/rpmsigdig.at b/tests/rpmsigdig.at
|
|
index b726e79ef..14dffc27a 100644
|
|
--- a/tests/rpmsigdig.at
|
|
+++ b/tests/rpmsigdig.at
|
|
@@ -1028,6 +1028,14 @@ cmp -s ${ORIG} ${NEW}; echo $?
|
|
],
|
|
[])
|
|
|
|
+RPMTEST_CHECK([
|
|
+run rpmsign --define "__gpg_sign_cmd mumble" --key-id 1964C5FC --addsign "${RPMTEST}"/tmp/hello-2.0-1.x86_64.rpm > /dev/null
|
|
+],
|
|
+[1],
|
|
+[],
|
|
+[error: Invalid sign command: mumble
|
|
+])
|
|
+
|
|
# rpmsign --addsign <signed>
|
|
RPMTEST_CHECK([
|
|
RPMDB_INIT
|
|
--
|
|
2.47.0
|
|
|