Compare commits
10 Commits
Author | SHA1 | Date |
---|---|---|
Lubos Kardos | 165614f3dd | |
Lubos Kardos | 367ec3f990 | |
Lubos Kardos | 7a8cd25c20 | |
Lubos Kardos | afee5b61a3 | |
Jaromir Capik | b0b7f20ef8 | |
Florian Festi | 76d3f4014f | |
Florian Festi | 3b6a3d6051 | |
Lubos Kardos | 8e0e97732b | |
Florian Festi | cecc1e8906 | |
Florian Festi | 03c3322d9a |
|
@ -0,0 +1,34 @@
|
|||
#requires popt
|
||||
#requires nss-softokn
|
||||
#requires nss
|
||||
#requires file
|
||||
#requires libarchive
|
||||
#requires libdb4
|
||||
#requires redhat-rpm-config
|
||||
#requires lua
|
||||
#requires autoconf
|
||||
#requires pkgconfig
|
||||
|
||||
|
||||
(cd $SRC/rpm-*/ && autoreconf -vif)
|
||||
|
||||
mcd $BUILDDIR/rpm
|
||||
|
||||
$SRC/rpm-*/configure $TCONFIGARGS \
|
||||
--build=${TARGET} \
|
||||
--host=${TARGET} \
|
||||
--target=${TARGET} \
|
||||
CPPFLAGS="-I/usr/include/nspr -I/usr/include/nss3 -DPACKAGE -DPACKAGE_VERSION" \
|
||||
--libdir=/usr/lib${SUFFIX} \
|
||||
--with-external-db \
|
||||
--disable-static \
|
||||
--with-lua \
|
||||
--localstatedir=/var
|
||||
|
||||
make $J
|
||||
make $J install
|
||||
|
||||
mkdir -p /etc/rpm
|
||||
mkdir -p /var/lib/rpm
|
||||
|
||||
rpm --initdb
|
|
@ -0,0 +1,29 @@
|
|||
From 97989236c0f39ccbc7f2c1d52cc30f167fd827fe Mon Sep 17 00:00:00 2001
|
||||
From: Florian Festi <ffesti@redhat.com>
|
||||
Date: Mon, 26 Jan 2015 14:22:34 +0100
|
||||
Subject: [PATCH] Fix Python import directive for more strict Python3 search
|
||||
rules
|
||||
|
||||
Fixes http://rpm.org/ticket/885
|
||||
---
|
||||
python/rpm/transaction.py | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/python/rpm/transaction.py b/python/rpm/transaction.py
|
||||
index db7ca67..91a6cc1 100644
|
||||
--- a/python/rpm/transaction.py
|
||||
+++ b/python/rpm/transaction.py
|
||||
@@ -37,8 +37,8 @@ class TransactionSet(TransactionSetCore):
|
||||
return self._wrapSetGet('_probFilter', ignoreSet)
|
||||
|
||||
def parseSpec(self, specfile):
|
||||
- import _rpmb
|
||||
- return _rpmb.spec(specfile)
|
||||
+ import rpm._rpmb
|
||||
+ return rpm._rpmb.spec(specfile)
|
||||
|
||||
def getKeys(self):
|
||||
keys = []
|
||||
--
|
||||
2.1.0
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
From 9c36ca411332d2718eca339e867561c39abc256b Mon Sep 17 00:00:00 2001
|
||||
From: Lubos Kardos <lkardos@redhat.com>
|
||||
Date: Fri, 6 Nov 2015 14:49:59 +0100
|
||||
Subject: [PATCH] Fix crash when parsing corrupted RPM file (rhbz:1273360)
|
||||
|
||||
---
|
||||
lib/legacy.c | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/lib/legacy.c b/lib/legacy.c
|
||||
index 422c2b0..8ba7bbd 100644
|
||||
--- a/lib/legacy.c
|
||||
+++ b/lib/legacy.c
|
||||
@@ -25,7 +25,7 @@ static void compressFilelist(Header h)
|
||||
char ** dirNames;
|
||||
const char ** baseNames;
|
||||
uint32_t * dirIndexes;
|
||||
- rpm_count_t count;
|
||||
+ rpm_count_t count, realCount = 0;
|
||||
int i;
|
||||
int dirIndex = -1;
|
||||
|
||||
@@ -58,6 +58,7 @@ static void compressFilelist(Header h)
|
||||
while ((i = rpmtdNext(&fileNames)) >= 0) {
|
||||
dirIndexes[i] = dirIndex;
|
||||
baseNames[i] = rpmtdGetString(&fileNames);
|
||||
+ realCount++;
|
||||
}
|
||||
goto exit;
|
||||
}
|
||||
@@ -87,19 +88,20 @@ static void compressFilelist(Header h)
|
||||
(needle = bsearch(&filename, dirNames, dirIndex + 1, sizeof(dirNames[0]), dncmp)) == NULL) {
|
||||
char *s = xmalloc(len + 1);
|
||||
rstrlcpy(s, filename, len + 1);
|
||||
- dirIndexes[i] = ++dirIndex;
|
||||
+ dirIndexes[realCount] = ++dirIndex;
|
||||
dirNames[dirIndex] = s;
|
||||
} else
|
||||
- dirIndexes[i] = needle - dirNames;
|
||||
+ dirIndexes[realCount] = needle - dirNames;
|
||||
|
||||
*baseName = savechar;
|
||||
- baseNames[i] = baseName;
|
||||
+ baseNames[realCount] = baseName;
|
||||
+ realCount++;
|
||||
}
|
||||
|
||||
exit:
|
||||
if (count > 0) {
|
||||
- headerPutUint32(h, RPMTAG_DIRINDEXES, dirIndexes, count);
|
||||
- headerPutStringArray(h, RPMTAG_BASENAMES, baseNames, count);
|
||||
+ headerPutUint32(h, RPMTAG_DIRINDEXES, dirIndexes, realCount);
|
||||
+ headerPutStringArray(h, RPMTAG_BASENAMES, baseNames, realCount);
|
||||
headerPutStringArray(h, RPMTAG_DIRNAMES,
|
||||
(const char **) dirNames, dirIndex + 1);
|
||||
}
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
From 363c015da5cbf315df267dc53580290984039804 Mon Sep 17 00:00:00 2001
|
||||
From: Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
Date: Wed, 15 Apr 2015 09:51:08 +0200
|
||||
Subject: [PATCH] Make sure references to go sources in debuginfo packages go
|
||||
to the installed path and not the source file in the build environment.
|
||||
|
||||
- Resolves: rhbz#1184221
|
||||
---
|
||||
tools/debugedit.c | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/tools/debugedit.c b/tools/debugedit.c
|
||||
index 0f85885..cf89312 100644
|
||||
--- a/tools/debugedit.c
|
||||
+++ b/tools/debugedit.c
|
||||
@@ -480,7 +480,7 @@ edit_dwarf2_line (DSO *dso, uint32_t off, char *comp_dir, int phase)
|
||||
unsigned char *endcu, *endprol;
|
||||
unsigned char opcode_base;
|
||||
uint32_t value, dirt_cnt;
|
||||
- size_t comp_dir_len = strlen (comp_dir);
|
||||
+ size_t comp_dir_len = !comp_dir ? 0 : strlen (comp_dir);
|
||||
size_t abs_file_cnt = 0, abs_dir_cnt = 0;
|
||||
|
||||
if (phase != 0)
|
||||
@@ -950,7 +950,7 @@ edit_attributes (DSO *dso, unsigned char *ptr, struct abbrev_tag *t, int phase)
|
||||
}
|
||||
}
|
||||
|
||||
- if (found_list_offs && comp_dir)
|
||||
+ if (found_list_offs)
|
||||
edit_dwarf2_line (dso, list_offs, comp_dir, phase);
|
||||
|
||||
free (comp_dir);
|
||||
--
|
||||
2.1.0
|
||||
|
|
@ -0,0 +1,201 @@
|
|||
From 6a8924b4c9df8e3597f7b4aa3de46498d390c5a8 Mon Sep 17 00:00:00 2001
|
||||
From: Lubos Kardos <lkardos@redhat.com>
|
||||
Date: Tue, 9 Jun 2015 14:19:59 +0200
|
||||
Subject: [PATCH 1/2] Use named pipe instead of stdin as input for gpg
|
||||
|
||||
This enables running gpg with access to the shell the rpmsign command
|
||||
is running in. This is needed to allow gpg to get passphrase by itself.
|
||||
---
|
||||
sign/rpmgensig.c | 105 ++++++++++++++++++++++++++++++++++++++++++-------------
|
||||
1 file changed, 80 insertions(+), 25 deletions(-)
|
||||
|
||||
diff --git a/sign/rpmgensig.c b/sign/rpmgensig.c
|
||||
index 0bd14e3..9691f0d 100644
|
||||
--- a/sign/rpmgensig.c
|
||||
+++ b/sign/rpmgensig.c
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <errno.h>
|
||||
#include <sys/wait.h>
|
||||
#include <popt.h>
|
||||
+#include <libgen.h>
|
||||
|
||||
#include <rpm/rpmlib.h> /* RPMSIGTAG & related */
|
||||
#include <rpm/rpmmacro.h>
|
||||
@@ -33,6 +34,68 @@ typedef struct sigTarget_s {
|
||||
rpm_loff_t size;
|
||||
} *sigTarget;
|
||||
|
||||
+/*
|
||||
+ * There is no function for creating unique temporary fifos so create
|
||||
+ * unique temporary directory and then create fifo in it.
|
||||
+ */
|
||||
+static char *mkTempFifo(void)
|
||||
+{
|
||||
+ char *tmppath = NULL, *tmpdir = NULL, *fifofn = NULL;
|
||||
+ mode_t mode;
|
||||
+
|
||||
+ tmppath = rpmExpand("%{_tmppath}", NULL);
|
||||
+ if (rpmioMkpath(tmppath, 0755, (uid_t) -1, (gid_t) -1))
|
||||
+ goto exit;
|
||||
+
|
||||
+
|
||||
+ tmpdir = rpmGetPath(tmppath, "/rpm-tmp.XXXXXX", NULL);
|
||||
+ mode = umask(0077);
|
||||
+ tmpdir = mkdtemp(tmpdir);
|
||||
+ umask(mode);
|
||||
+ if (tmpdir == NULL) {
|
||||
+ rpmlog(RPMLOG_ERR, _("error creating temp directory %s: %m\n"),
|
||||
+ tmpdir);
|
||||
+ tmpdir = _free(tmpdir);
|
||||
+ goto exit;
|
||||
+ }
|
||||
+
|
||||
+ fifofn = rpmGetPath(tmpdir, "/fifo", NULL);
|
||||
+ if (mkfifo(fifofn, 0600) == -1) {
|
||||
+ rpmlog(RPMLOG_ERR, _("error creating fifo %s: %m\n"), fifofn);
|
||||
+ fifofn = _free(fifofn);
|
||||
+ }
|
||||
+
|
||||
+exit:
|
||||
+ if (fifofn == NULL && tmpdir != NULL)
|
||||
+ unlink(tmpdir);
|
||||
+
|
||||
+ free(tmppath);
|
||||
+ free(tmpdir);
|
||||
+
|
||||
+ return fifofn;
|
||||
+}
|
||||
+
|
||||
+/* Delete fifo and then temporary directory in which it was located */
|
||||
+static int rpmRmTempFifo(const char *fn)
|
||||
+{
|
||||
+ int rc = 0;
|
||||
+ char *dfn = NULL, *dir = NULL;
|
||||
+
|
||||
+ if ((rc = unlink(fn)) != 0) {
|
||||
+ rpmlog(RPMLOG_ERR, _("error delete fifo %s: %m\n"), fn);
|
||||
+ return rc;
|
||||
+ }
|
||||
+
|
||||
+ dfn = xstrdup(fn);
|
||||
+ dir = dirname(dfn);
|
||||
+
|
||||
+ if ((rc = rmdir(dir)) != 0)
|
||||
+ rpmlog(RPMLOG_ERR, _("error delete directory %s: %m\n"), dir);
|
||||
+ free(dfn);
|
||||
+
|
||||
+ return rc;
|
||||
+}
|
||||
+
|
||||
static int closeFile(FD_t *fdp)
|
||||
{
|
||||
if (fdp == NULL || *fdp == NULL)
|
||||
@@ -186,8 +249,9 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
{
|
||||
int pid = 0, status;
|
||||
int inpipe[2];
|
||||
- int inpipe2[2];
|
||||
FILE * fpipe = NULL;
|
||||
+ FD_t fnamedPipe = NULL;
|
||||
+ char *namedPipeName = NULL;
|
||||
unsigned char buf[BUFSIZ];
|
||||
ssize_t count;
|
||||
ssize_t wantCount;
|
||||
@@ -200,13 +264,9 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
- inpipe2[0] = inpipe2[1] = 0;
|
||||
- if (pipe(inpipe2) < 0) {
|
||||
- rpmlog(RPMLOG_ERR, _("Couldn't create pipe for signing: %m"));
|
||||
- goto exit;
|
||||
- }
|
||||
+ namedPipeName = mkTempFifo();
|
||||
|
||||
- addMacro(NULL, "__plaintext_filename", NULL, "-", -1);
|
||||
+ addMacro(NULL, "__plaintext_filename", NULL, namedPipeName, -1);
|
||||
addMacro(NULL, "__signature_filename", NULL, sigfile, -1);
|
||||
|
||||
if (!(pid = fork())) {
|
||||
@@ -217,9 +277,6 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
(void) dup2(inpipe[0], 3);
|
||||
(void) close(inpipe[1]);
|
||||
|
||||
- (void) dup2(inpipe2[0], STDIN_FILENO);
|
||||
- (void) close(inpipe2[1]);
|
||||
-
|
||||
if (gpg_path && *gpg_path != '\0')
|
||||
(void) setenv("GNUPGHOME", gpg_path, 1);
|
||||
(void) setenv("LC_ALL", "C", 1);
|
||||
@@ -240,8 +297,6 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
|
||||
(void) close(inpipe[0]);
|
||||
inpipe[0] = 0;
|
||||
- (void) close(inpipe2[0]);
|
||||
- inpipe2[0] = 0;
|
||||
|
||||
fpipe = fdopen(inpipe[1], "w");
|
||||
if (!fpipe) {
|
||||
@@ -257,12 +312,11 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
(void) fclose(fpipe);
|
||||
fpipe = NULL;
|
||||
|
||||
- fpipe = fdopen(inpipe2[1], "w");
|
||||
- if (!fpipe) {
|
||||
- rpmlog(RPMLOG_ERR, _("fdopen failed\n"));
|
||||
+ fnamedPipe = Fopen(namedPipeName, "w");
|
||||
+ if (!fnamedPipe) {
|
||||
+ rpmlog(RPMLOG_ERR, _("Fopen failed\n"));
|
||||
goto exit;
|
||||
}
|
||||
- inpipe2[1] = 0;
|
||||
|
||||
if (Fseek(sigt->fd, sigt->start, SEEK_SET) < 0) {
|
||||
rpmlog(RPMLOG_ERR, _("Could not seek in file %s: %s\n"),
|
||||
@@ -273,8 +327,8 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
size = sigt->size;
|
||||
wantCount = size < sizeof(buf) ? size : sizeof(buf);
|
||||
while ((count = Fread(buf, sizeof(buf[0]), wantCount, sigt->fd)) > 0) {
|
||||
- fwrite(buf, sizeof(buf[0]), count, fpipe);
|
||||
- if (ferror(fpipe)) {
|
||||
+ Fwrite(buf, sizeof(buf[0]), count, fnamedPipe);
|
||||
+ if (Ferror(fnamedPipe)) {
|
||||
rpmlog(RPMLOG_ERR, _("Could not write to pipe\n"));
|
||||
goto exit;
|
||||
}
|
||||
@@ -286,8 +340,8 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
sigt->fileName, Fstrerror(sigt->fd));
|
||||
goto exit;
|
||||
}
|
||||
- fclose(fpipe);
|
||||
- fpipe = NULL;
|
||||
+ Fclose(fnamedPipe);
|
||||
+ fnamedPipe = NULL;
|
||||
|
||||
(void) waitpid(pid, &status, 0);
|
||||
pid = 0;
|
||||
@@ -307,15 +361,16 @@ exit:
|
||||
if (inpipe[1])
|
||||
close(inpipe[1]);
|
||||
|
||||
- if (inpipe2[0])
|
||||
- close(inpipe[0]);
|
||||
-
|
||||
- if (inpipe2[1])
|
||||
- close(inpipe[1]);
|
||||
+ if (fnamedPipe)
|
||||
+ Fclose(fnamedPipe);
|
||||
|
||||
if (pid)
|
||||
waitpid(pid, &status, 0);
|
||||
|
||||
+ if (namedPipeName) {
|
||||
+ rpmRmTempFifo(namedPipeName);
|
||||
+ free(namedPipeName);
|
||||
+ }
|
||||
|
||||
return rc;
|
||||
}
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -0,0 +1,370 @@
|
|||
From 0bce5fcf270711a2e077fba0fb7c5979ea007eb5 Mon Sep 17 00:00:00 2001
|
||||
From: Lubos Kardos <lkardos@redhat.com>
|
||||
Date: Tue, 9 Jun 2015 18:06:29 +0200
|
||||
Subject: [PATCH 2/2] Allow gpg to get passphrase by itself.
|
||||
|
||||
Remove rpm asking for passphrase and then passing this passphrase
|
||||
to gpg via file descriptor (--passphrase-fd) but provide gpg with
|
||||
access to unredirected stdin to get passphrase directly from user.
|
||||
|
||||
Remove also macro %__gpg_check_password_cmd because in this new signing
|
||||
scheme has no sense. rpm doesn't handle passphrase in any way,
|
||||
everything is done in gpg including checking of passphrase.
|
||||
|
||||
We did this modification because of changes in gpg behavior. Since
|
||||
gpg-2.1 option "--passphrase-fd" doesn't work by default, only when
|
||||
it is explicitly allowed in gpg.conf. (rhbz:#1228234)
|
||||
---
|
||||
macros.in | 4 +--
|
||||
python/rpmsmodule.c | 9 +++---
|
||||
rpmsign.c | 82 +++--------------------------------------------------
|
||||
sign/rpmgensig.c | 67 +++++++++----------------------------------
|
||||
sign/rpmsign.h | 3 +-
|
||||
5 files changed, 23 insertions(+), 142 deletions(-)
|
||||
|
||||
diff --git a/macros.in b/macros.in
|
||||
index 414c1be..de89420 100644
|
||||
--- a/macros.in
|
||||
+++ b/macros.in
|
||||
@@ -538,11 +538,9 @@ package or when debugging this package.\
|
||||
# Macro(s) to hold the arguments passed to GPG/PGP for package
|
||||
# signing and verification.
|
||||
#
|
||||
-%__gpg_check_password_cmd %{__gpg} \
|
||||
- gpg --batch --no-verbose --passphrase-fd 3 -u "%{_gpg_name}" -so -
|
||||
|
||||
%__gpg_sign_cmd %{__gpg} \
|
||||
- gpg --batch --no-verbose --no-armor --passphrase-fd 3 \
|
||||
+ gpg --no-verbose --no-armor \
|
||||
%{?_gpg_digest_algo:--digest-algo %{_gpg_digest_algo}} \
|
||||
--no-secmem-warning \
|
||||
-u "%{_gpg_name}" -sbo %{__signature_filename} %{__plaintext_filename}
|
||||
diff --git a/python/rpmsmodule.c b/python/rpmsmodule.c
|
||||
index a8289b5..0601353 100644
|
||||
--- a/python/rpmsmodule.c
|
||||
+++ b/python/rpmsmodule.c
|
||||
@@ -8,19 +8,18 @@ static char rpms__doc__[] =
|
||||
static PyObject * addSign(PyObject * self, PyObject * args, PyObject *kwds)
|
||||
{
|
||||
const char *path = NULL;
|
||||
- const char *passPhrase = NULL;
|
||||
- char * kwlist[] = { "path", "passPhrase", "keyid", "hashalgo", NULL };
|
||||
+ char * kwlist[] = { "path", "keyid", "hashalgo", NULL };
|
||||
struct rpmSignArgs sig, *sigp = NULL;
|
||||
|
||||
memset(&sig, 0, sizeof(sig));
|
||||
- if (!PyArg_ParseTupleAndKeywords(args, kwds, "ss|si", kwlist,
|
||||
- &path, &passPhrase, &sig.keyid, &sig.hashalgo))
|
||||
+ if (!PyArg_ParseTupleAndKeywords(args, kwds, "s|si", kwlist,
|
||||
+ &path, &sig.keyid, &sig.hashalgo))
|
||||
return NULL;
|
||||
|
||||
if (sig.keyid || sig.hashalgo)
|
||||
sigp = &sig;
|
||||
|
||||
- return PyBool_FromLong(rpmPkgSign(path, sigp, passPhrase) == 0);
|
||||
+ return PyBool_FromLong(rpmPkgSign(path, sigp) == 0);
|
||||
}
|
||||
|
||||
static PyObject * delSign(PyObject * self, PyObject * args, PyObject *kwds)
|
||||
diff --git a/rpmsign.c b/rpmsign.c
|
||||
index b8e5598..9b93e39 100644
|
||||
--- a/rpmsign.c
|
||||
+++ b/rpmsign.c
|
||||
@@ -41,72 +41,6 @@ static struct poptOption optionsTable[] = {
|
||||
POPT_TABLEEND
|
||||
};
|
||||
|
||||
-static int checkPassPhrase(const char * passPhrase)
|
||||
-{
|
||||
- int passPhrasePipe[2];
|
||||
- int pid, status;
|
||||
- int rc = -1;
|
||||
- int xx;
|
||||
-
|
||||
- if (passPhrase == NULL)
|
||||
- return -1;
|
||||
-
|
||||
- passPhrasePipe[0] = passPhrasePipe[1] = 0;
|
||||
- if (pipe(passPhrasePipe))
|
||||
- return -1;
|
||||
-
|
||||
- pid = fork();
|
||||
- if (pid < 0) {
|
||||
- close(passPhrasePipe[0]);
|
||||
- close(passPhrasePipe[1]);
|
||||
- return -1;
|
||||
- }
|
||||
-
|
||||
- if (pid == 0) {
|
||||
- char * cmd, * gpg_path;
|
||||
- char *const *av;
|
||||
- int fdno;
|
||||
-
|
||||
- close(STDIN_FILENO);
|
||||
- close(STDOUT_FILENO);
|
||||
- close(passPhrasePipe[1]);
|
||||
- if ((fdno = open("/dev/null", O_RDONLY)) != STDIN_FILENO) {
|
||||
- xx = dup2(fdno, STDIN_FILENO);
|
||||
- close(fdno);
|
||||
- }
|
||||
- if ((fdno = open("/dev/null", O_WRONLY)) != STDOUT_FILENO) {
|
||||
- xx = dup2(fdno, STDOUT_FILENO);
|
||||
- close(fdno);
|
||||
- }
|
||||
- xx = dup2(passPhrasePipe[0], 3);
|
||||
-
|
||||
- unsetenv("MALLOC_CHECK_");
|
||||
- gpg_path = rpmExpand("%{?_gpg_path}", NULL);
|
||||
-
|
||||
- if (!rstreq(gpg_path, ""))
|
||||
- setenv("GNUPGHOME", gpg_path, 1);
|
||||
-
|
||||
- cmd = rpmExpand("%{?__gpg_check_password_cmd}", NULL);
|
||||
- rc = poptParseArgvString(cmd, NULL, (const char ***)&av);
|
||||
- if (xx >= 0 && rc == 0) {
|
||||
- rc = execve(av[0], av+1, environ);
|
||||
- fprintf(stderr, _("Could not exec %s: %s\n"), "gpg",
|
||||
- strerror(errno));
|
||||
- }
|
||||
- _exit(EXIT_FAILURE);
|
||||
- }
|
||||
-
|
||||
- close(passPhrasePipe[0]);
|
||||
- xx = write(passPhrasePipe[1], passPhrase, strlen(passPhrase));
|
||||
- xx = write(passPhrasePipe[1], "\n", 1);
|
||||
- close(passPhrasePipe[1]);
|
||||
-
|
||||
- if (xx >= 0 && waitpid(pid, &status, 0) >= 0)
|
||||
- rc = (WIFEXITED(status) && WEXITSTATUS(status) == 0) ? 0 : 1;
|
||||
-
|
||||
- return rc;
|
||||
-}
|
||||
-
|
||||
/* TODO: permit overriding macro setup on the command line */
|
||||
static int doSign(poptContext optCon)
|
||||
{
|
||||
@@ -119,18 +53,10 @@ static int doSign(poptContext optCon)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
- /* XXX FIXME: eliminate obsolete getpass() usage */
|
||||
- passPhrase = getpass(_("Enter pass phrase: "));
|
||||
- passPhrase = (passPhrase != NULL) ? rstrdup(passPhrase) : NULL;
|
||||
- if (checkPassPhrase(passPhrase) == 0) {
|
||||
- const char *arg;
|
||||
- fprintf(stderr, _("Pass phrase is good.\n"));
|
||||
- rc = 0;
|
||||
- while ((arg = poptGetArg(optCon)) != NULL) {
|
||||
- rc += rpmPkgSign(arg, NULL, passPhrase);
|
||||
- }
|
||||
- } else {
|
||||
- fprintf(stderr, _("Pass phrase check failed or gpg key expired\n"));
|
||||
+ const char *arg;
|
||||
+ rc = 0;
|
||||
+ while ((arg = poptGetArg(optCon)) != NULL) {
|
||||
+ rc += rpmPkgSign(arg, NULL);
|
||||
}
|
||||
|
||||
exit:
|
||||
diff --git a/sign/rpmgensig.c b/sign/rpmgensig.c
|
||||
index 9691f0d..24bf39e 100644
|
||||
--- a/sign/rpmgensig.c
|
||||
+++ b/sign/rpmgensig.c
|
||||
@@ -245,11 +245,9 @@ exit:
|
||||
return rc;
|
||||
}
|
||||
|
||||
-static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
+static int runGPG(sigTarget sigt, const char *sigfile)
|
||||
{
|
||||
int pid = 0, status;
|
||||
- int inpipe[2];
|
||||
- FILE * fpipe = NULL;
|
||||
FD_t fnamedPipe = NULL;
|
||||
char *namedPipeName = NULL;
|
||||
unsigned char buf[BUFSIZ];
|
||||
@@ -258,12 +256,6 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
rpm_loff_t size;
|
||||
int rc = 1; /* assume failure */
|
||||
|
||||
- inpipe[0] = inpipe[1] = 0;
|
||||
- if (pipe(inpipe) < 0) {
|
||||
- rpmlog(RPMLOG_ERR, _("Couldn't create pipe for signing: %m"));
|
||||
- goto exit;
|
||||
- }
|
||||
-
|
||||
namedPipeName = mkTempFifo();
|
||||
|
||||
addMacro(NULL, "__plaintext_filename", NULL, namedPipeName, -1);
|
||||
@@ -274,9 +266,6 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
char *cmd = NULL;
|
||||
const char *gpg_path = rpmExpand("%{?_gpg_path}", NULL);
|
||||
|
||||
- (void) dup2(inpipe[0], 3);
|
||||
- (void) close(inpipe[1]);
|
||||
-
|
||||
if (gpg_path && *gpg_path != '\0')
|
||||
(void) setenv("GNUPGHOME", gpg_path, 1);
|
||||
(void) setenv("LC_ALL", "C", 1);
|
||||
@@ -295,23 +284,6 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
delMacro(NULL, "__plaintext_filename");
|
||||
delMacro(NULL, "__signature_filename");
|
||||
|
||||
- (void) close(inpipe[0]);
|
||||
- inpipe[0] = 0;
|
||||
-
|
||||
- fpipe = fdopen(inpipe[1], "w");
|
||||
- if (!fpipe) {
|
||||
- rpmlog(RPMLOG_ERR, _("fdopen failed\n"));
|
||||
- goto exit;
|
||||
- }
|
||||
- inpipe[1] = 0;
|
||||
-
|
||||
- if (fprintf(fpipe, "%s\n", (passPhrase ? passPhrase : "")) < 0) {
|
||||
- rpmlog(RPMLOG_ERR, _("Could not write to pipe\n"));
|
||||
- goto exit;
|
||||
- }
|
||||
- (void) fclose(fpipe);
|
||||
- fpipe = NULL;
|
||||
-
|
||||
fnamedPipe = Fopen(namedPipeName, "w");
|
||||
if (!fnamedPipe) {
|
||||
rpmlog(RPMLOG_ERR, _("Fopen failed\n"));
|
||||
@@ -352,14 +324,6 @@ static int runGPG(sigTarget sigt, const char *sigfile, const char * passPhrase)
|
||||
}
|
||||
|
||||
exit:
|
||||
- if (fpipe)
|
||||
- fclose(fpipe);
|
||||
-
|
||||
- if (inpipe[0])
|
||||
- close(inpipe[0]);
|
||||
-
|
||||
- if (inpipe[1])
|
||||
- close(inpipe[1]);
|
||||
|
||||
if (fnamedPipe)
|
||||
Fclose(fnamedPipe);
|
||||
@@ -383,8 +347,7 @@ exit:
|
||||
* @param passPhrase private key pass phrase
|
||||
* @return 0 on success, 1 on failure
|
||||
*/
|
||||
-static int makeGPGSignature(Header sigh, int ishdr, sigTarget sigt,
|
||||
- const char * passPhrase)
|
||||
+static int makeGPGSignature(Header sigh, int ishdr, sigTarget sigt)
|
||||
{
|
||||
char * sigfile = rstrscat(NULL, sigt->fileName, ".sig", NULL);
|
||||
struct stat st;
|
||||
@@ -392,7 +355,7 @@ static int makeGPGSignature(Header sigh, int ishdr, sigTarget sigt,
|
||||
size_t pktlen = 0;
|
||||
int rc = 1; /* assume failure */
|
||||
|
||||
- if (runGPG(sigt, sigfile, passPhrase))
|
||||
+ if (runGPG(sigt, sigfile))
|
||||
goto exit;
|
||||
|
||||
if (stat(sigfile, &st)) {
|
||||
@@ -431,16 +394,15 @@ exit:
|
||||
return rc;
|
||||
}
|
||||
|
||||
-static int rpmGenSignature(Header sigh, sigTarget sigt1, sigTarget sigt2,
|
||||
- const char * passPhrase)
|
||||
+static int rpmGenSignature(Header sigh, sigTarget sigt1, sigTarget sigt2)
|
||||
{
|
||||
int ret;
|
||||
|
||||
- ret = makeGPGSignature(sigh, 0, sigt1, passPhrase);
|
||||
+ ret = makeGPGSignature(sigh, 0, sigt1);
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
- ret = makeGPGSignature(sigh, 1, sigt2, passPhrase);
|
||||
+ ret = makeGPGSignature(sigh, 1, sigt2);
|
||||
if (ret)
|
||||
goto exit;
|
||||
exit:
|
||||
@@ -486,8 +448,7 @@ static int sameSignature(rpmTagVal sigtag, Header h1, Header h2)
|
||||
return (rc == 0);
|
||||
}
|
||||
|
||||
-static int replaceSignature(Header sigh, sigTarget sigt1, sigTarget sigt2,
|
||||
- const char *passPhrase)
|
||||
+static int replaceSignature(Header sigh, sigTarget sigt1, sigTarget sigt2)
|
||||
{
|
||||
/* Grab a copy of the header so we can compare the result */
|
||||
Header oldsigh = headerCopy(sigh);
|
||||
@@ -500,7 +461,7 @@ static int replaceSignature(Header sigh, sigTarget sigt1, sigTarget sigt2,
|
||||
* rpmGenSignature() internals parse the actual signing result and
|
||||
* adds appropriate tags for DSA/RSA.
|
||||
*/
|
||||
- if (rpmGenSignature(sigh, sigt1, sigt2, passPhrase) == 0) {
|
||||
+ if (rpmGenSignature(sigh, sigt1, sigt2) == 0) {
|
||||
/* Lets see what we got and whether its the same signature as before */
|
||||
rpmTagVal sigtag = headerIsEntry(sigh, RPMSIGTAG_DSA) ?
|
||||
RPMSIGTAG_DSA : RPMSIGTAG_RSA;
|
||||
@@ -517,10 +478,9 @@ static int replaceSignature(Header sigh, sigTarget sigt1, sigTarget sigt2,
|
||||
* Create/modify elements in signature header.
|
||||
* @param rpm path to package
|
||||
* @param deleting adding or deleting signature?
|
||||
- * @param passPhrase passPhrase (ignored when deleting)
|
||||
* @return 0 on success, -1 on error
|
||||
*/
|
||||
-static int rpmSign(const char *rpm, int deleting, const char *passPhrase)
|
||||
+static int rpmSign(const char *rpm, int deleting)
|
||||
{
|
||||
FD_t fd = NULL;
|
||||
FD_t ofd = NULL;
|
||||
@@ -605,7 +565,7 @@ static int rpmSign(const char *rpm, int deleting, const char *passPhrase)
|
||||
sigt2 = sigt1;
|
||||
sigt2.size = headerSizeof(h, HEADER_MAGIC_YES);
|
||||
|
||||
- res = replaceSignature(sigh, &sigt1, &sigt2, passPhrase);
|
||||
+ res = replaceSignature(sigh, &sigt1, &sigt2);
|
||||
if (res != 0) {
|
||||
if (res == 1) {
|
||||
rpmlog(RPMLOG_WARNING,
|
||||
@@ -722,8 +682,7 @@ exit:
|
||||
return res;
|
||||
}
|
||||
|
||||
-int rpmPkgSign(const char *path,
|
||||
- const struct rpmSignArgs * args, const char *passPhrase)
|
||||
+int rpmPkgSign(const char *path, const struct rpmSignArgs * args)
|
||||
{
|
||||
int rc;
|
||||
|
||||
@@ -739,7 +698,7 @@ int rpmPkgSign(const char *path,
|
||||
}
|
||||
}
|
||||
|
||||
- rc = rpmSign(path, 0, passPhrase);
|
||||
+ rc = rpmSign(path, 0);
|
||||
|
||||
if (args) {
|
||||
if (args->hashalgo) {
|
||||
@@ -755,5 +714,5 @@ int rpmPkgSign(const char *path,
|
||||
|
||||
int rpmPkgDelSign(const char *path)
|
||||
{
|
||||
- return rpmSign(path, 1, NULL);
|
||||
+ return rpmSign(path, 1);
|
||||
}
|
||||
diff --git a/sign/rpmsign.h b/sign/rpmsign.h
|
||||
index 15b3e0f..e161aff 100644
|
||||
--- a/sign/rpmsign.h
|
||||
+++ b/sign/rpmsign.h
|
||||
@@ -21,8 +21,7 @@ struct rpmSignArgs {
|
||||
* @param passPhrase passphrase for the signing key
|
||||
* @return 0 on success
|
||||
*/
|
||||
-int rpmPkgSign(const char *path,
|
||||
- const struct rpmSignArgs * args, const char *passPhrase);
|
||||
+int rpmPkgSign(const char *path, const struct rpmSignArgs * args);
|
||||
|
||||
/** \ingroup rpmsign
|
||||
* Delete signature(s) from a package
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -0,0 +1,117 @@
|
|||
diff -up rpm-4.12.0.1/build/files.c.umacros rpm-4.12.0.1/build/files.c
|
||||
--- rpm-4.12.0.1/build/files.c.umacros 2014-06-30 10:47:13.928503700 +0200
|
||||
+++ rpm-4.12.0.1/build/files.c 2016-02-29 14:28:40.949514813 +0100
|
||||
@@ -1590,6 +1590,7 @@ static rpmRC readFilesManifest(rpmSpec s
|
||||
FILE *fd = NULL;
|
||||
rpmRC rc = RPMRC_FAIL;
|
||||
unsigned int nlines = 0;
|
||||
+ char *expanded;
|
||||
|
||||
if (*path == '/') {
|
||||
fn = rpmGetPath(path, NULL);
|
||||
@@ -1607,11 +1608,12 @@ static rpmRC readFilesManifest(rpmSpec s
|
||||
while (fgets(buf, sizeof(buf), fd)) {
|
||||
if (handleComments(buf))
|
||||
continue;
|
||||
- if (expandMacros(spec, spec->macros, buf, sizeof(buf))) {
|
||||
+ if(rpmExpandMacros(spec->macros, buf, &expanded, 0) < 0) {
|
||||
rpmlog(RPMLOG_ERR, _("line: %s\n"), buf);
|
||||
goto exit;
|
||||
}
|
||||
- argvAdd(&(pkg->fileList), buf);
|
||||
+ argvAdd(&(pkg->fileList), expanded);
|
||||
+ free(expanded);
|
||||
nlines++;
|
||||
}
|
||||
|
||||
diff -up rpm-4.12.0.1/build/pack.c.umacros rpm-4.12.0.1/build/pack.c
|
||||
--- rpm-4.12.0.1/build/pack.c.umacros 2016-02-29 14:28:30.001660705 +0100
|
||||
+++ rpm-4.12.0.1/build/pack.c 2016-02-29 14:28:40.950514800 +0100
|
||||
@@ -132,11 +132,13 @@ static rpmRC addFileToTag(rpmSpec spec,
|
||||
}
|
||||
|
||||
while (fgets(buf, sizeof(buf), f)) {
|
||||
- if (expandMacros(spec, spec->macros, buf, sizeof(buf))) {
|
||||
+ char *expanded;
|
||||
+ if(rpmExpandMacros(spec->macros, buf, &expanded, 0) < 0) {
|
||||
rpmlog(RPMLOG_ERR, _("%s: line: %s\n"), fn, buf);
|
||||
goto exit;
|
||||
}
|
||||
- appendStringBuf(sb, buf);
|
||||
+ appendStringBuf(sb, expanded);
|
||||
+ free(expanded);
|
||||
}
|
||||
headerPutString(h, tag, getStringBuf(sb));
|
||||
rc = RPMRC_OK;
|
||||
diff -up rpm-4.12.0.1/build/parseSpec.c.umacros rpm-4.12.0.1/build/parseSpec.c
|
||||
--- rpm-4.12.0.1/build/parseSpec.c.umacros 2014-09-15 09:17:36.378270111 +0200
|
||||
+++ rpm-4.12.0.1/build/parseSpec.c 2016-02-29 14:32:05.618787380 +0100
|
||||
@@ -207,11 +207,16 @@ static int copyNextLineFromOFI(rpmSpec s
|
||||
spec->lbufOff = 0;
|
||||
|
||||
/* Don't expand macros (eg. %define) in false branch of %if clause */
|
||||
- if (spec->readStack->reading &&
|
||||
- expandMacros(spec, spec->macros, spec->lbuf, spec->lbufSize)) {
|
||||
+ if (spec->readStack->reading) {
|
||||
+ char *expanded;
|
||||
+ if (rpmExpandMacros(spec->macros, spec->lbuf, &expanded, 0) < 0) {
|
||||
rpmlog(RPMLOG_ERR, _("line %d: %s\n"),
|
||||
spec->lineNum, spec->lbuf);
|
||||
return -1;
|
||||
+ }
|
||||
+ free(spec->lbuf);
|
||||
+ spec->lbuf = expanded;
|
||||
+ spec->lbufSize = strlen(spec->lbuf) + 1;
|
||||
}
|
||||
spec->nextline = spec->lbuf;
|
||||
}
|
||||
diff -up rpm-4.12.0.1/rpmio/macro.c.umacros rpm-4.12.0.1/rpmio/macro.c
|
||||
--- rpm-4.12.0.1/rpmio/macro.c.umacros 2014-07-01 11:07:07.070211597 +0200
|
||||
+++ rpm-4.12.0.1/rpmio/macro.c 2016-02-29 14:28:40.951514786 +0100
|
||||
@@ -1462,6 +1462,25 @@ int expandMacros(void * spec, rpmMacroCo
|
||||
return rc;
|
||||
}
|
||||
|
||||
+
|
||||
+int rpmExpandMacros(rpmMacroContext mc, const char * sbuf, char ** obuf, int flags)
|
||||
+{
|
||||
+ char *target = NULL;
|
||||
+ int rc;
|
||||
+
|
||||
+ mc = rpmmctxAcquire(mc);
|
||||
+ rc = doExpandMacros(mc, sbuf, &target);
|
||||
+ rpmmctxRelease(mc);
|
||||
+
|
||||
+ if (rc) {
|
||||
+ free(target);
|
||||
+ return -1;
|
||||
+ } else {
|
||||
+ *obuf = target;
|
||||
+ return 1;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void
|
||||
rpmDumpMacroTable(rpmMacroContext mc, FILE * fp)
|
||||
{
|
||||
diff -up rpm-4.12.0.1/rpmio/rpmmacro.h.umacros rpm-4.12.0.1/rpmio/rpmmacro.h
|
||||
--- rpm-4.12.0.1/rpmio/rpmmacro.h.umacros 2014-06-30 10:47:14.105503272 +0200
|
||||
+++ rpm-4.12.0.1/rpmio/rpmmacro.h 2016-02-29 14:28:40.952514773 +0100
|
||||
@@ -66,6 +66,17 @@ int expandMacros (void * spec, rpmMacroC
|
||||
size_t slen);
|
||||
|
||||
/** \ingroup rpmmacro
|
||||
+ * Expand macro into buffer.
|
||||
+ * @param mc macro context (NULL uses global context).
|
||||
+ * @param sbuf input macro to expand
|
||||
+ * @param obuf macro expansion (malloc'ed)
|
||||
+ * @param flags flags (currently unused)
|
||||
+ * @return negative on failure
|
||||
+ */
|
||||
+int rpmExpandMacros (rpmMacroContext mc, const char * sbuf,
|
||||
+ char ** obuf, int flags);
|
||||
+
|
||||
+/** \ingroup rpmmacro
|
||||
* Add macro to context.
|
||||
* @deprecated Use rpmDefineMacro().
|
||||
* @param mc macro context (NULL uses global context).
|
|
@ -0,0 +1,157 @@
|
|||
diff --git a/doc/rpm.8 b/doc/rpm.8
|
||||
index e583009..283e8ac 100644
|
||||
--- a/doc/rpm.8
|
||||
+++ b/doc/rpm.8
|
||||
@@ -58,6 +58,8 @@ rpm \- RPM Package Manager
|
||||
[\fB--hdrid \fISHA1\fB\fR] [\fB--pkgid \fIMD5\fB\fR] [\fB--tid \fITID\fB\fR]
|
||||
[\fB--querybynumber \fIHDRNUM\fB\fR] [\fB--triggeredby \fIPACKAGE_NAME\fB\fR]
|
||||
[\fB--whatprovides \fICAPABILITY\fB\fR] [\fB--whatrequires \fICAPABILITY\fB\fR]
|
||||
+ [\fB--whatrecommends \fICAPABILITY\fB\fR] [\fB--whatsuggests \fICAPABILITY\fB\fR]
|
||||
+ [\fB--whatsupplements \fICAPABILITY\fB\fR] [\fB--whatenhances \fICAPABILITY\fB\fR]
|
||||
|
||||
.SS "query-options"
|
||||
.PP
|
||||
@@ -588,6 +590,18 @@ Query all packages that provide the \fICAPABILITY\fR capability.
|
||||
.TP
|
||||
\fB--whatrequires \fICAPABILITY\fB\fR
|
||||
Query all packages that require \fICAPABILITY\fR for proper functioning.
|
||||
+.TP
|
||||
+\fB--whatrecommends \fICAPABILITY\fB\fR
|
||||
+Query all packages that recommend \fICAPABILITY\fR.
|
||||
+.TP
|
||||
+\fB--whatsuggests \fICAPABILITY\fB\fR
|
||||
+Query all packages that suggest \fICAPABILITY\fR.
|
||||
+.TP
|
||||
+\fB--whatsupplements \fICAPABILITY\fB\fR
|
||||
+Query all packages that supplement \fICAPABILITY\fR.
|
||||
+.TP
|
||||
+\fB--whatenhances \fICAPABILITY\fB\fR
|
||||
+Query all packages that enhance \fICAPABILITY\fR.
|
||||
.SS "PACKAGE QUERY OPTIONS:"
|
||||
.PP
|
||||
.TP
|
||||
diff --git a/lib/poptQV.c b/lib/poptQV.c
|
||||
index 3db17b0..80edce7 100644
|
||||
--- a/lib/poptQV.c
|
||||
+++ b/lib/poptQV.c
|
||||
@@ -21,6 +21,10 @@ struct rpmQVKArguments_s rpmQVKArgs;
|
||||
#define POPT_QUERYBYPKGID -1007
|
||||
#define POPT_QUERYBYHDRID -1008
|
||||
#define POPT_QUERYBYTID -1010
|
||||
+#define POPT_WHATRECOMMENDS -1011
|
||||
+#define POPT_WHATSUGGESTS -1012
|
||||
+#define POPT_WHATSUPPLEMENTS -1013
|
||||
+#define POPT_WHATENHANCES -1014
|
||||
|
||||
/* ========== Query/Verify/Signature source args */
|
||||
static void rpmQVSourceArgCallback( poptContext con,
|
||||
@@ -45,6 +49,10 @@ static void rpmQVSourceArgCallback( poptContext con,
|
||||
case 'p': qva->qva_source |= RPMQV_RPM; break;
|
||||
case POPT_WHATPROVIDES: qva->qva_source |= RPMQV_WHATPROVIDES; break;
|
||||
case POPT_WHATREQUIRES: qva->qva_source |= RPMQV_WHATREQUIRES; break;
|
||||
+ case POPT_WHATRECOMMENDS: qva->qva_source |= RPMQV_WHATRECOMMENDS; break;
|
||||
+ case POPT_WHATSUGGESTS: qva->qva_source |= RPMQV_WHATSUGGESTS; break;
|
||||
+ case POPT_WHATSUPPLEMENTS: qva->qva_source |= RPMQV_WHATSUPPLEMENTS; break;
|
||||
+ case POPT_WHATENHANCES: qva->qva_source |= RPMQV_WHATENHANCES; break;
|
||||
case POPT_TRIGGEREDBY: qva->qva_source |= RPMQV_TRIGGEREDBY; break;
|
||||
case POPT_QUERYBYPKGID: qva->qva_source |= RPMQV_PKGID; break;
|
||||
case POPT_QUERYBYHDRID: qva->qva_source |= RPMQV_HDRID; break;
|
||||
@@ -93,6 +101,14 @@ struct poptOption rpmQVSourcePoptTable[] = {
|
||||
N_("query/verify the package(s) which require a dependency"), "CAPABILITY" },
|
||||
{ "whatprovides", '\0', 0, 0, POPT_WHATPROVIDES,
|
||||
N_("query/verify the package(s) which provide a dependency"), "CAPABILITY" },
|
||||
+ { "whatrecommends", '\0', 0, 0, POPT_WHATRECOMMENDS,
|
||||
+ N_("query/verify the package(s) which recommends a dependency"), "CAPABILITY" },
|
||||
+ { "whatsuggests", '\0', 0, 0, POPT_WHATSUGGESTS,
|
||||
+ N_("query/verify the package(s) which suggests a dependency"), "CAPABILITY" },
|
||||
+ { "whatsupplements", '\0', 0, 0, POPT_WHATSUPPLEMENTS,
|
||||
+ N_("query/verify the package(s) which supplements a dependency"), "CAPABILITY" },
|
||||
+ { "whatenhances", '\0', 0, 0, POPT_WHATENHANCES,
|
||||
+ N_("query/verify the package(s) which enhances a dependency"), "CAPABILITY" },
|
||||
|
||||
{ "noglob", '\0', POPT_BIT_SET|POPT_ARGFLAG_DOC_HIDDEN, &giFlags, RPMGI_NOGLOB,
|
||||
N_("do not glob arguments"), NULL},
|
||||
diff --git a/lib/query.c b/lib/query.c
|
||||
index 896ebe3..b15b99b 100644
|
||||
--- a/lib/query.c
|
||||
+++ b/lib/query.c
|
||||
@@ -384,6 +384,34 @@ static rpmdbMatchIterator initQueryIterator(QVA_t qva, rpmts ts, const char * ar
|
||||
}
|
||||
break;
|
||||
|
||||
+ case RPMQV_WHATRECOMMENDS:
|
||||
+ mi = rpmtsInitIterator(ts, RPMDBI_RECOMMENDNAME, arg, 0);
|
||||
+ if (mi == NULL) {
|
||||
+ rpmlog(RPMLOG_NOTICE, _("no package recommends %s\n"), arg);
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ case RPMQV_WHATSUGGESTS:
|
||||
+ mi = rpmtsInitIterator(ts, RPMDBI_SUGGESTNAME, arg, 0);
|
||||
+ if (mi == NULL) {
|
||||
+ rpmlog(RPMLOG_NOTICE, _("no package suggests %s\n"), arg);
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ case RPMQV_WHATSUPPLEMENTS:
|
||||
+ mi = rpmtsInitIterator(ts, RPMDBI_SUPPLEMENTNAME, arg, 0);
|
||||
+ if (mi == NULL) {
|
||||
+ rpmlog(RPMLOG_NOTICE, _("no package supplements %s\n"), arg);
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
+ case RPMQV_WHATENHANCES:
|
||||
+ mi = rpmtsInitIterator(ts, RPMDBI_ENHANCENAME, arg, 0);
|
||||
+ if (mi == NULL) {
|
||||
+ rpmlog(RPMLOG_NOTICE, _("no package enhances %s\n"), arg);
|
||||
+ }
|
||||
+ break;
|
||||
+
|
||||
case RPMQV_WHATPROVIDES:
|
||||
if (arg[0] != '/' && arg[0] != '.') {
|
||||
mi = rpmtsInitIterator(ts, RPMDBI_PROVIDENAME, arg, 0);
|
||||
diff --git a/lib/rpmcli.h b/lib/rpmcli.h
|
||||
index 48e8250..4adb3d1 100644
|
||||
--- a/lib/rpmcli.h
|
||||
+++ b/lib/rpmcli.h
|
||||
@@ -91,6 +91,10 @@ enum rpmQVSources_e {
|
||||
RPMQV_HDRID, /*!< ... from header id (immutable header SHA1). */
|
||||
RPMQV_TID, /*!< ... from install transaction id (time stamp). */
|
||||
RPMQV_SPECSRPM, /*!< ... from spec file source (query only). */
|
||||
+ RPMQV_WHATRECOMMENDS, /*!< ... from recommends db search. */
|
||||
+ RPMQV_WHATSUGGESTS, /*!< ... from suggests db search. */
|
||||
+ RPMQV_WHATSUPPLEMENTS, /*!< ... from supplements db search. */
|
||||
+ RPMQV_WHATENHANCES, /*!< ... from enhances db search. */
|
||||
};
|
||||
|
||||
typedef rpmFlags rpmQVSources;
|
||||
diff --git a/lib/rpmdb.c b/lib/rpmdb.c
|
||||
index b6d3247..baa1974 100644
|
||||
--- a/lib/rpmdb.c
|
||||
+++ b/lib/rpmdb.c
|
||||
@@ -493,6 +493,10 @@ static rpmdb newRpmdb(const char * root, const char * home,
|
||||
RPMDBI_INSTALLTID,
|
||||
RPMDBI_SIGMD5,
|
||||
RPMDBI_SHA1HEADER,
|
||||
+ RPMDBI_RECOMMENDNAME,
|
||||
+ RPMDBI_SUGGESTNAME,
|
||||
+ RPMDBI_SUPPLEMENTNAME,
|
||||
+ RPMDBI_ENHANCENAME,
|
||||
};
|
||||
|
||||
if (!(db_home && db_home[0] != '%')) {
|
||||
diff --git a/lib/rpmtag.h b/lib/rpmtag.h
|
||||
index 12a2a50..1dc1c2b 100644
|
||||
--- a/lib/rpmtag.h
|
||||
+++ b/lib/rpmtag.h
|
||||
@@ -353,6 +353,10 @@ typedef enum rpmDbiTag_e {
|
||||
RPMDBI_SIGMD5 = RPMTAG_SIGMD5,
|
||||
RPMDBI_SHA1HEADER = RPMTAG_SHA1HEADER,
|
||||
RPMDBI_INSTFILENAMES = RPMTAG_INSTFILENAMES,
|
||||
+ RPMDBI_RECOMMENDNAME = RPMTAG_RECOMMENDNAME,
|
||||
+ RPMDBI_SUGGESTNAME = RPMTAG_SUGGESTNAME,
|
||||
+ RPMDBI_SUPPLEMENTNAME = RPMTAG_SUPPLEMENTNAME,
|
||||
+ RPMDBI_ENHANCENAME = RPMTAG_ENHANCENAME,
|
||||
} rpmDbiTag;
|
||||
|
||||
/** \ingroup signature
|
|
@ -0,0 +1,63 @@
|
|||
From c336b1474402a566d5351ff41c45559d02a3389a Mon Sep 17 00:00:00 2001
|
||||
From: Florian Festi <ffesti@redhat.com>
|
||||
Date: Wed, 24 Jun 2015 15:48:23 +0200
|
||||
Subject: [PATCH] Add --enhances, --recommends, --suggests and --supplements to
|
||||
the man page
|
||||
|
||||
---
|
||||
doc/rpm.8 | 22 ++++++++++++++++++----
|
||||
1 file changed, 18 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/doc/rpm.8 b/doc/rpm.8
|
||||
index c91ce3b..136a595 100644
|
||||
--- a/doc/rpm.8
|
||||
+++ b/doc/rpm.8
|
||||
@@ -66,10 +66,12 @@ rpm \- RPM Package Manager
|
||||
|
||||
|
||||
[\fB--changelog\fR] [\fB-c,--configfiles\fR] [\fB--conflicts\fR]
|
||||
- [\fB-d,--docfiles\fR] [\fB--dump\fR] [\fB--filesbypkg\fR] [\fB-i,--info\fR]
|
||||
- [\fB--last\fR] [\fB-l,--list\fR] [\fB--obsoletes\fR] [\fB--provides\fR]
|
||||
- [\fB--qf,--queryformat \fIQUERYFMT\fB\fR] [\fB-R,--requires\fR]
|
||||
- [\fB--scripts\fR] [\fB-s,--state\fR] [\fB--triggers,--triggerscripts\fR]
|
||||
+ [\fB-d,--docfiles\fR] [\fB--dump\fR] [\fB--enhances\fR] [\fB--filesbypkg\fR]
|
||||
+ [\fB-i,--info\fR] [\fB--last\fR] [\fB-l,--list\fR] [\fB--obsoletes\fR]
|
||||
+ [\fB--provides\fR] [\fB--qf,--queryformat \fIQUERYFMT\fB\fR]
|
||||
+ [\fB--recommends\fR] [\fB-R,--requires\fR] [\fB--suggests\fR]
|
||||
+ [\fB--supplements\fR] [\fB--scripts\fR] [\fB-s,--state\fR]
|
||||
+ [\fB--triggers,--triggerscripts\fR]
|
||||
|
||||
.SS "verify-options"
|
||||
.PP
|
||||
@@ -628,6 +630,9 @@ path size mtime digest mode owner group isconfig isdoc rdev symlink
|
||||
.fi
|
||||
.RE
|
||||
.TP
|
||||
+\fB--enhances\fR
|
||||
+List capabilities enhanced by package(s)
|
||||
+.TP
|
||||
\fB--filesbypkg\fR
|
||||
List all the files in each selected package.
|
||||
.TP
|
||||
@@ -651,9 +656,18 @@ List packages this package obsoletes.
|
||||
\fB--provides\fR
|
||||
List capabilities this package provides.
|
||||
.TP
|
||||
+\fB--recommends\fR
|
||||
+List capabilities recommended by package(s)
|
||||
+.TP
|
||||
\fB-R, --requires\fR
|
||||
List capabilities on which this package depends.
|
||||
.TP
|
||||
+\fB--suggests\fR
|
||||
+List capabilities suggested by package(s)
|
||||
+.TP
|
||||
+\fB--supplements\fR
|
||||
+List capabilities supplemented by package(s)
|
||||
+.TP
|
||||
\fB--scripts\fR
|
||||
List the package specific scriptlet(s) that are used as part
|
||||
of the installation and uninstallation processes.
|
||||
--
|
||||
2.1.0
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
From b722cf86200505b3e3fcbb2095c4ff61f1f5a2ab Mon Sep 17 00:00:00 2001
|
||||
From: Lubos Kardos <lkardos@redhat.com>
|
||||
Date: Mon, 25 Apr 2016 13:31:08 +0200
|
||||
Subject: [PATCH 1/2] Fix reading rpmtd behind its size in formatValue()
|
||||
(rhbz:1316896)
|
||||
|
||||
When it is read from index higher than size of rpmtd, return "(none)".
|
||||
---
|
||||
lib/headerfmt.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/lib/headerfmt.c b/lib/headerfmt.c
|
||||
index fb29d6f..f6fd707 100644
|
||||
--- a/lib/headerfmt.c
|
||||
+++ b/lib/headerfmt.c
|
||||
@@ -623,7 +623,7 @@ static char * formatValue(headerSprintfArgs hsa, sprintfTag tag, int element)
|
||||
char * t, * te;
|
||||
rpmtd td;
|
||||
|
||||
- if ((td = getData(hsa, tag->tag))) {
|
||||
+ if ((td = getData(hsa, tag->tag)) && td->count > element) {
|
||||
td->ix = element; /* Ick, use iterators instead */
|
||||
val = tag->fmt(td);
|
||||
} else {
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
From cddf43a56f19711866371f02f378dc4095b0fadd Mon Sep 17 00:00:00 2001
|
||||
From: Lubos Kardos <lkardos@redhat.com>
|
||||
Date: Mon, 25 Apr 2016 14:38:47 +0200
|
||||
Subject: [PATCH 2/2] Fix sigsegv in stringFormat() (rhbz:1316903)
|
||||
|
||||
Just skip duping of NULL and return it. Returned NULL is handled in
|
||||
upper layer.
|
||||
---
|
||||
lib/formats.c | 7 +++++--
|
||||
1 file changed, 5 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/lib/formats.c b/lib/formats.c
|
||||
index e3626ed..bad0b2d 100644
|
||||
--- a/lib/formats.c
|
||||
+++ b/lib/formats.c
|
||||
@@ -44,9 +44,12 @@ static char * stringFormat(rpmtd td)
|
||||
case RPM_NUMERIC_CLASS:
|
||||
rasprintf(&val, "%" PRIu64, rpmtdGetNumber(td));
|
||||
break;
|
||||
- case RPM_STRING_CLASS:
|
||||
- val = xstrdup(rpmtdGetString(td));
|
||||
+ case RPM_STRING_CLASS: {
|
||||
+ const char *str = rpmtdGetString(td);
|
||||
+ if (str)
|
||||
+ val = xstrdup(str);
|
||||
break;
|
||||
+ }
|
||||
case RPM_BINARY_CLASS:
|
||||
val = pgpHexStr(td->data, td->count);
|
||||
break;
|
||||
--
|
||||
1.9.3
|
||||
|
41
rpm.spec
41
rpm.spec
|
@ -27,7 +27,7 @@
|
|||
Summary: The RPM package management system
|
||||
Name: rpm
|
||||
Version: %{rpmver}
|
||||
Release: %{?snapver:0.%{snapver}.}8%{?dist}
|
||||
Release: %{?snapver:0.%{snapver}.}17%{?dist}
|
||||
Group: System Environment/Base
|
||||
Url: http://www.rpm.org/
|
||||
Source0: http://rpm.org/releases/rpm-4.12.x/%{name}-%{srcver}.tar.bz2
|
||||
|
@ -59,6 +59,17 @@ Patch102: rpm-4.12.0-archive-endian.patch
|
|||
# find-debuginfo.sh fails on ELF with more than 256 notes
|
||||
# http://www.rpm.org/ticket/887
|
||||
Patch103: 0001-Fix-find-debuginfo.sh-for-ELF-with-file-warnings.patch
|
||||
# Fix golang debuginfo packages
|
||||
Patch104: rpm-4.12.0-golang-debuginfo.patch
|
||||
Patch105: rpm-4.12.0-whatrecommends.patch
|
||||
Patch108: rpm-4.12.0-gpg-passphrase1.patch
|
||||
Patch109: rpm-4.12.0-gpg-passphrase2.patch
|
||||
Patch110: rpm-4.12.0-Fix-Python3-import.patch
|
||||
Patch111: rpm-4.12.x-weakdeps-manpage.patch
|
||||
Patch112: rpm-4.12.0-fix-crash-on-corrupted.patch
|
||||
Patch113: rpm-4.12.0-unlimited-macro-expand.patch
|
||||
Patch114: rpm-4.13.0-rpmtd-out-of-bounds.patch
|
||||
Patch115: rpm-4.13.0-stringFormat-sigsegv.patch
|
||||
|
||||
# These are not yet upstream
|
||||
Patch302: rpm-4.7.1-geode-i686.patch
|
||||
|
@ -543,6 +554,34 @@ exit 0
|
|||
%doc doc/librpm/html/*
|
||||
|
||||
%changelog
|
||||
* Mon Apr 25 2016 Lubos Kardos <lkardos@redhat.com> - 4.12.0.1-17
|
||||
- Fix sigsegv in stringFormat() (#1316903)
|
||||
- Fix reading rpmtd behind its size in formatValue() (#1316896)
|
||||
|
||||
* Mon Feb 29 2016 Lubos Kardos <lkardos@redhat.com> - 4.12.0.1-16
|
||||
- Fix problems caused by the changes done in the previous version
|
||||
|
||||
* Mon Feb 29 2016 Lubos Kardos <lkardos@redhat.com> - 4.12.0.1-15
|
||||
- Remove size limit when expanding macros (#1303034)
|
||||
|
||||
* Fri Nov 20 2015 Lubos Kardos <lkardos@redhat.com> - 4.12.0.1-14
|
||||
- Fix crash when parsing corrupted RPM file (#1273360)
|
||||
|
||||
* Fri Oct 30 2015 Florian Festi <ffesti@rpm.org> - 4.12.0.1-13
|
||||
- Add query options for weak dependencies to the man page (#1235230)
|
||||
|
||||
* Mon Jun 29 2015 Florian Festi <ffesti@rpm.org> - 4.12.0.1-12
|
||||
- Fix Python import directive for more strict Python3 search rules (#1236493)
|
||||
|
||||
* Fri Jun 19 2015 Lubos Kardos <lkardos@redhat.com> 4.12.0.1-11
|
||||
- Allow gpg to get passphrase by itself (#1228234)
|
||||
|
||||
* Fri Jun 12 2015 Florian Festi <ffesti@rpm.org> - 4.12.0.1-10
|
||||
- Add --whatrecommends and friends (#1231247)
|
||||
|
||||
* Wed Apr 15 2015 Florian Festi <ffesti@rpm.org> - 4.12.0.1-9
|
||||
- Fix references to sources in golang debuginfo packages (#1184221)
|
||||
|
||||
* Mon Mar 16 2015 Than Ngo <than@redhat.com> - 4.12.0.1-8
|
||||
- bump release and rebuild so that koji-shadow can rebuild it
|
||||
against new gcc on secondary arch
|
||||
|
|
Loading…
Reference in New Issue