Compare commits

...

10 Commits
master ... f22

Author SHA1 Message Date
Lubos Kardos 165614f3dd - Fix sigsegv in stringFormat()
- resolves: #1316903
- Fix reading rpmtd behind its size in formatValue()
- resolves: #1316896
2016-04-25 15:48:15 +02:00
Lubos Kardos 367ec3f990 - Fix problems caused by the changes done in the previous commit 2016-02-29 14:35:01 +01:00
Lubos Kardos 7a8cd25c20 - Remove size limit when expanding macros
- Resolves: #1303034
2016-02-29 10:47:42 +01:00
Lubos Kardos afee5b61a3 - Fix crash when parsing corrupted RPM file
- Resolves: #1273360
2015-11-20 14:05:37 +01:00
Jaromir Capik b0b7f20ef8 Adding STAGE2 bootstrap recipe 2015-11-04 16:39:20 +01:00
Florian Festi 76d3f4014f - Add query options for weak dependencies to the man page
- Resolves: #1235230
2015-10-30 10:41:23 +01:00
Florian Festi 3b6a3d6051 - Fix Python import directive for more strict Python3 search rules
- Resolves: #1236493
2015-06-29 12:22:22 +02:00
Lubos Kardos 8e0e97732b - Allow gpg to get passphrase by itself
- resolves: #1228234
2015-06-19 11:34:31 +02:00
Florian Festi cecc1e8906 - Add --whatrecommends and friends
- resolves: #1231247
2015-06-12 18:04:20 +02:00
Florian Festi 03c3322d9a - Fix references to go sources in debuginfo packages
- resolves: #1184221

Conflicts:
	rpm.spec
2015-04-15 10:13:50 +02:00
12 changed files with 1166 additions and 1 deletions

34
STAGE2-rpm Normal file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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).

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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