upgrade version to 4.17.0

This commit is contained in:
rwx403335 2021-12-27 19:59:18 +08:00
parent 717e509dbe
commit f3cd9ef3b0
45 changed files with 352 additions and 2047 deletions

View File

@ -17,9 +17,9 @@ index 402749362..8619c1323 100644
--- a/macros.in
+++ b/macros.in
@@ -1184,6 +1184,7 @@ package or when debugging this package.\
%__transaction_ima %{__plugindir}/ima.so
%__transaction_prioreset %{__plugindir}/prioreset.so
%__transaction_audit %{__plugindir}/audit.so
%__transaction_dbus_announce %{__plugindir}/dbus_announce.so
+%__transaction_digest_list %{__plugindir}/digest_list.so
#------------------------------------------------------------------------------
@ -41,10 +41,11 @@ new file mode 100644
index 000000000..beb397309
--- /dev/null
+++ b/plugins/digest_list.c
@@ -0,0 +1,498 @@
@@ -0,0 +1,499 @@
+#include "system.h"
+#include "errno.h"
+
+#include <fcntl.h>
+#include <rpm/rpmlog.h>
+#include <rpm/rpmts.h>
+#include <rpm/header.h>
@ -565,7 +566,7 @@ index 46cd0f31a..3c6b18b53 100644
} break;
case 4:
@@ -658,6 +659,7 @@ static int pgpPrtSig(pgpTag tag, const uint8_t *h, size_t hlen,
if (p > (h + hlen))
if (p > hend)
return 1;
+ _digp->data = p;

View File

@ -1,102 +0,0 @@
From 8f4b3c3cab8922a2022b9e47c71f1ecf906077ef Mon Sep 17 00:00:00 2001
From: Demi Marie Obenour <athena@invisiblethingslab.com>
Date: Mon, 8 Feb 2021 16:05:01 -0500
Subject: [PATCH] hdrblobInit() needs bounds checks too
Users can pass untrusted data to hdrblobInit() and it must be robust
against this.
---
lib/header.c | 48 +++++++++++++++++++++++++++++++-----------------
1 file changed, 31 insertions(+), 17 deletions(-)
diff --git a/lib/header.c b/lib/header.c
index ea39e679f4..ebba9c2b09 100644
--- a/lib/header.c
+++ b/lib/header.c
@@ -11,6 +11,7 @@
#include "system.h"
#include <netdb.h>
#include <errno.h>
+#include <inttypes.h>
#include <rpm/rpmtypes.h>
#include <rpm/rpmstring.h>
#include "lib/header_internal.h"
@@ -1912,6 +1913,25 @@ hdrblob hdrblobFree(hdrblob blob)
return NULL;
}
+static rpmRC hdrblobVerifyLengths(rpmTagVal regionTag, uint32_t il, uint32_t dl,
+ char **emsg) {
+ uint32_t il_max = HEADER_TAGS_MAX;
+ uint32_t dl_max = HEADER_DATA_MAX;
+ if (regionTag == RPMTAG_HEADERSIGNATURES) {
+ il_max = 32;
+ dl_max = 64 * 1024 * 1024;
+ }
+ if (hdrchkRange(il_max, il)) {
+ rasprintf(emsg, _("hdr tags: BAD, no. of tags(%" PRIu32 ") out of range"), il);
+ return RPMRC_FAIL;
+ }
+ if (hdrchkRange(dl_max, dl)) {
+ rasprintf(emsg, _("hdr data: BAD, no. of bytes(%" PRIu32 ") out of range"), dl);
+ return RPMRC_FAIL;
+ }
+ return RPMRC_OK;
+}
+
rpmRC hdrblobRead(FD_t fd, int magic, int exact_size, rpmTagVal regionTag, hdrblob blob, char **emsg)
{
int32_t block[4];
@@ -1924,13 +1944,6 @@ rpmRC hdrblobRead(FD_t fd, int magic, int exact_size, rpmTagVal regionTag, hdrbl
size_t nb;
rpmRC rc = RPMRC_FAIL; /* assume failure */
int xx;
- int32_t il_max = HEADER_TAGS_MAX;
- int32_t dl_max = HEADER_DATA_MAX;
-
- if (regionTag == RPMTAG_HEADERSIGNATURES) {
- il_max = 32;
- dl_max = 64 * 1024 * 1024;
- }
memset(block, 0, sizeof(block));
if ((xx = Freadall(fd, bs, blen)) != blen) {
@@ -1943,15 +1956,9 @@ rpmRC hdrblobRead(FD_t fd, int magic, int exact_size, rpmTagVal regionTag, hdrbl
goto exit;
}
il = ntohl(block[2]);
- if (hdrchkRange(il_max, il)) {
- rasprintf(emsg, _("hdr tags: BAD, no. of tags(%d) out of range"), il);
- goto exit;
- }
dl = ntohl(block[3]);
- if (hdrchkRange(dl_max, dl)) {
- rasprintf(emsg, _("hdr data: BAD, no. of bytes(%d) out of range"), dl);
+ if (hdrblobVerifyLengths(regionTag, il, dl, emsg))
goto exit;
- }
nb = (il * sizeof(struct entryInfo_s)) + dl;
uc = sizeof(il) + sizeof(dl) + nb;
@@ -1995,11 +2002,18 @@ rpmRC hdrblobInit(const void *uh, size_t uc,
struct hdrblob_s *blob, char **emsg)
{
rpmRC rc = RPMRC_FAIL;
-
memset(blob, 0, sizeof(*blob));
+ if (uc && uc < 8) {
+ rasprintf(emsg, _("hdr length: BAD"));
+ goto exit;
+ }
+
blob->ei = (int32_t *) uh; /* discards const */
- blob->il = ntohl(blob->ei[0]);
- blob->dl = ntohl(blob->ei[1]);
+ blob->il = ntohl((uint32_t)(blob->ei[0]));
+ blob->dl = ntohl((uint32_t)(blob->ei[1]));
+ if (hdrblobVerifyLengths(regionTag, blob->il, blob->dl, emsg) != RPMRC_OK)
+ goto exit;
+
blob->pe = (entryInfo) &(blob->ei[2]);
blob->pvlen = sizeof(blob->il) + sizeof(blob->dl) +
(blob->il * sizeof(*blob->pe)) + blob->dl;

View File

@ -20,7 +20,7 @@ index 147059bb5..c3d898b4c 100644
+ (dist && strstr(field, dist)) ? "" : dist);
free(dist);
}
if (rpmCharCheck(spec, field, WHITELIST_VERREL))
if (rpmCharCheck(spec, field, ALLOWED_CHARS_VERREL))
--
2.27.GIT

View File

@ -39,19 +39,19 @@ index 6dfd801c8..ab6938d8c 100644
static void nullAttrRec(AttrRec ar)
{
memset(ar, 0, sizeof(*ar));
@@ -984,11 +991,13 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)
@@ -997,11 +997,14 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)
{
FileListRec flp;
char buf[BUFSIZ];
+ char file_info[BUFSIZ];
+ char file_digest[128 * 2 + 1];
int i, npaths = 0;
int fail_on_dupes = rpmExpandNumeric("%{?_duplicate_files_terminate_build}") > 0;
uint32_t defaultalgo = PGPHASHALGO_MD5, digestalgo;
rpm_loff_t totalFileSize = 0;
Header h = pkg->header; /* just a shortcut */
- int override_date = 0;
+ int override_date = 0, processed = 0;
time_t source_date_epoch;
+ int processed = 0;
time_t source_date_epoch = 0;
char *srcdate = getenv("SOURCE_DATE_EPOCH");
@@ -1058,8 +1067,9 @@ static void genCpioListAndHeader(FileList fl, Package pkg, int isSrc)

View File

@ -1,36 +0,0 @@
From 4a71a3eccd7e9e14ee0e83b1cb300386a93622cd Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Fri, 13 Dec 2019 14:14:10 +0200
Subject: [PATCH] Silence spurious error message from lsetfilecon() on
-EOPNOTSUPP
We already filter out -EOPNOTSUPP and return OK, but the message was
getting logged before the filtering so we'd spit out spurious error
messages on filesystems that don't support SELinux (RhBug:1777502)
---
plugins/selinux.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/plugins/selinux.c b/plugins/selinux.c
index a51f95e..ba37ffa 100644
--- a/plugins/selinux.c
+++ b/plugins/selinux.c
@@ -168,11 +168,12 @@ static rpmRC selinux_fsm_file_prepare(rpmPlugin plugin, rpmfi fi,
if (selabel_lookup_raw(sehandle, &scon, dest, file_mode) == 0) {
int conrc = lsetfilecon(path, scon);
- rpmlog(loglvl(conrc < 0), "lsetfilecon: (%s, %s) %s\n",
- path, scon, (conrc < 0 ? strerror(errno) : ""));
-
if (conrc == 0 || (conrc < 0 && errno == EOPNOTSUPP))
rc = RPMRC_OK;
+
+ rpmlog(loglvl(rc != RPMRC_OK), "lsetfilecon: (%s, %s) %s\n",
+ path, scon, (conrc < 0 ? strerror(errno) : ""));
+
freecon(scon);
} else {
/* No context for dest is not our headache */
--
1.8.3.1

View File

@ -31,7 +31,7 @@ index fe9803a..4027493 100644
+ CONFIG_SITE=${CONFIG_SITE:-NONE}\
+ export CONFIG_SITE\
\
%{verbose:set -x}\
%[%{verbose}?"set -x":""]\
umask 022\
--
1.8.3.1

View File

@ -1,113 +0,0 @@
From 153c5c219844f0f294862c9043b20f4d24f7fa69 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Tue, 18 Feb 2020 15:50:40 +0200
Subject: [PATCH] Use common error logic regardless of setexecfilecon()
availability
Refactor the custom exec context setting code to look like setexecfilecon()
in case the real one is not available to eliminate pesky behavioral
differences between the two cases.
This fixes a concrete bug of libselinux setexecfilecon() returning with
an error when security_getenforce() returns with -1 (such as a bare
chroot with no /sys mounts etc), causing us to spit out useless error
messages in that case ever since fixing the bogus if-logic in
commit ab601b882b9d9d8248250111317615db1aa7b7c6.
Fixes: #1077
---
plugins/selinux.c | 44 +++++++++++++++++++++-----------------------
1 file changed, 21 insertions(+), 23 deletions(-)
diff --git a/plugins/selinux.c b/plugins/selinux.c
index ba37ffabe..12545174d 100644
--- a/plugins/selinux.c
+++ b/plugins/selinux.c
@@ -94,65 +94,63 @@ static rpmRC selinux_psm_pre(rpmPlugin plugin, rpmte te)
return rc;
}
-static rpmRC selinux_scriptlet_fork_post(rpmPlugin plugin,
- const char *path, int type)
-{
- rpmRC rc = RPMRC_FAIL;
- int xx;
#ifndef HAVE_SETEXECFILECON
+static int setexecfilecon(const char *path, const char *fallback_type)
+{
+ int rc = -1;
security_context_t mycon = NULL, fcon = NULL, newcon = NULL;
context_t con = NULL;
- if (sehandle == NULL)
- return RPMRC_OK;
-
/* Figure the context to for next exec() */
if (getcon(&mycon) < 0)
goto exit;
if (getfilecon(path, &fcon) < 0)
goto exit;
- if (security_compute_create(mycon, fcon, string_to_security_class("process"), &newcon) < 0)
+ if (security_compute_create(mycon, fcon,
+ string_to_security_class("process"), &newcon) < 0)
goto exit;
if (rstreq(mycon, newcon)) {
- /* No default transition, use rpm_script_t for now. */
- const char * script_type = "rpm_script_t";
-
con = context_new(mycon);
if (!con)
goto exit;
- if (context_type_set(con, script_type))
+ if (context_type_set(con, fallback_type))
goto exit;
freecon(newcon);
newcon = xstrdup(context_str(con));
}
- if ((xx = setexeccon(newcon)) == 0)
- rc = RPMRC_OK;
-
- rpmlog(loglvl(xx < 0), "setexeccon: (%s, %s) %s\n",
- path, newcon, (xx < 0 ? strerror(errno) : ""));
+ rc = setexeccon(newcon);
exit:
context_free(con);
freecon(newcon);
freecon(fcon);
freecon(mycon);
+ return rc;
+}
+#endif
+
+static rpmRC selinux_scriptlet_fork_post(rpmPlugin plugin,
+ const char *path, int type)
+{
+ /* No default transition, use rpm_script_t for now. */
+ const char *script_type = "rpm_script_t";
+ rpmRC rc = RPMRC_FAIL;
-#else
if (sehandle == NULL)
return RPMRC_OK;
- if ((xx = setexecfilecon(path, "rpm_script_t")) == 0)
+ if (setexecfilecon(path, script_type) == 0)
rc = RPMRC_OK;
- rpmlog(loglvl(xx < 0), "setexecfilecon: (%s) %s\n",
- path, (xx < 0 ? strerror(errno) : ""));
-#endif
/* If selinux is not enforcing, we don't care either */
if (rc && security_getenforce() < 1)
rc = RPMRC_OK;
+ rpmlog(loglvl(rc), "setexecfilecon: (%s, %s) %s\n",
+ path, script_type, rc ? strerror(errno) : "");
+
return rc;
}
--

View File

@ -20,7 +20,7 @@ index b0a17c8..cac899a 100644
+ rasprintf(&field,"%s%s",field,dist);
+ free(dist);
+ }
if (rpmCharCheck(spec, field, WHITELIST_VERREL))
if (rpmCharCheck(spec, field, ALLOWED_CHARS_VERREL))
goto exit;
headerPutString(pkg->header, tag, field);
@@ -987,6 +992,8 @@ static rpmRC handlePreambleTag(rpmSpec spec, Package pkg, rpmTagVal tag,

View File

@ -1,26 +0,0 @@
From 213a4064a4b1b5b260a55b3933170599e617494d Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Tue, 1 Sep 2020 12:15:33 +0300
Subject: [PATCH] Add missing terminator to copyTagsFromMainDebug array
headerCopyTags() expects a 0-terminated array, this was overflowing
(spotted by address-sanitizer)
---
build/files.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/build/files.c b/build/files.c
index f06f9ac74..47625905c 100644
--- a/build/files.c
+++ b/build/files.c
@@ -2838,6 +2838,7 @@ static rpmTag copyTagsFromMainDebug[] = {
RPMTAG_OS,
RPMTAG_PLATFORM,
RPMTAG_OPTFLAGS,
+ 0
};
/* this is a hack: patch the summary and the description to include
--
2.27.0

View File

@ -1,32 +0,0 @@
From 38c03ddb18e86c84d89af695f72442d8365eb64e Mon Sep 17 00:00:00 2001
From: Florian Festi <ffesti@redhat.com>
Date: Tue, 21 Jul 2020 10:45:20 +0200
Subject: [PATCH] Always close libelf handle (#1313)
Otherwise executables that are not proper elf files are leaking libelf
handles. This results in file being left open (mmap'ed) and fails the
build on NFS as those files can't be deleted properly there.
Resolves: rhbz#1840728
See also: https://bugzilla.redhat.com/show_bug.cgi?id=1840728
---
build/files.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build/files.c b/build/files.c
index f675306f7..62489c07c 100644
--- a/build/files.c
+++ b/build/files.c
@@ -1935,8 +1935,8 @@ static int generateBuildIDs(FileList fl, ARGV_t *files)
if (terminate)
rc = 1;
}
- elf_end (elf);
}
+ elf_end (elf);
close (fd);
}
}
--
2.27.0

View File

@ -1,169 +0,0 @@
From d6a86b5e69e46cc283b1e06c92343319beb42e21 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Thu, 4 Mar 2021 13:21:19 +0200
Subject: [PATCH] Be much more careful about copying data from the signature
header
Conflict:NA
Reference:https://github.com/rpm-software-management/rpm/commit/d6a86b5e69e46cc283b1e06c92343319beb42e21
Only look for known tags, and ensure correct type and size where known
before copying over. Bump the old arbitrary 16k count limit to 16M limit
though, it's not inconceivable that a package could have that many files.
While at it, ensure none of these tags exist in the main header,
which would confuse us greatly.
This is optimized for backporting ease, upstream can remove redundancies
and further improve checking later.
Reported and initial patches by Demi Marie Obenour.
Fixes: RhBug:1935049, RhBug:1933867, RhBug:1935035, RhBug:1934125, ...
Fixes: CVE-2021-3421, CVE-2021-20271
---
lib/package.c | 112 +++++++++++++++++++++++++---------------------------------
1 file changed, 49 insertions(+), 63 deletions(-)
diff --git a/lib/package.c b/lib/package.c
index db70d13..6f10bb9 100644
--- a/lib/package.c
+++ b/lib/package.c
@@ -31,82 +31,67 @@ struct pkgdata_s {
rpmRC rc;
};
+struct taglate_s {
+ rpmTagVal stag;
+ rpmTagVal xtag;
+ rpm_count_t count;
+} const xlateTags[] = {
+ { RPMSIGTAG_SIZE, RPMTAG_SIGSIZE, 1 },
+ { RPMSIGTAG_PGP, RPMTAG_SIGPGP, 0 },
+ { RPMSIGTAG_MD5, RPMTAG_SIGMD5, 16 },
+ { RPMSIGTAG_GPG, RPMTAG_SIGGPG, 0 },
+ /* { RPMSIGTAG_PGP5, RPMTAG_SIGPGP5, 0 }, */ /* long obsolete, dont use */
+ { RPMSIGTAG_PAYLOADSIZE, RPMTAG_ARCHIVESIZE, 1 },
+ { RPMSIGTAG_FILESIGNATURES, RPMTAG_FILESIGNATURES, 0 },
+ { RPMSIGTAG_FILESIGNATURELENGTH, RPMTAG_FILESIGNATURELENGTH, 1 },
+ { RPMSIGTAG_SHA1, RPMTAG_SHA1HEADER, 1 },
+ { RPMSIGTAG_SHA256, RPMTAG_SHA256HEADER, 1 },
+ { RPMSIGTAG_DSA, RPMTAG_DSAHEADER, 0 },
+ { RPMSIGTAG_RSA, RPMTAG_RSAHEADER, 0 },
+ { RPMSIGTAG_LONGSIZE, RPMTAG_LONGSIGSIZE, 1 },
+ { RPMSIGTAG_LONGARCHIVESIZE, RPMTAG_LONGARCHIVESIZE, 1 },
+ { 0 }
+};
+
/** \ingroup header
* Translate and merge legacy signature tags into header.
* @param h header (dest)
* @param sigh signature header (src)
+ * @return failing tag number, 0 on success
*/
static
-void headerMergeLegacySigs(Header h, Header sigh)
+rpmTagVal headerMergeLegacySigs(Header h, Header sigh, char **msg)
{
- HeaderIterator hi;
+ const struct taglate_s *xl;
struct rpmtd_s td;
-
- hi = headerInitIterator(sigh);
- for (; headerNext(hi, &td); rpmtdFreeData(&td))
- {
- switch (td.tag) {
- /* XXX Translate legacy signature tag values. */
- case RPMSIGTAG_SIZE:
- td.tag = RPMTAG_SIGSIZE;
- break;
- case RPMSIGTAG_PGP:
- td.tag = RPMTAG_SIGPGP;
- break;
- case RPMSIGTAG_MD5:
- td.tag = RPMTAG_SIGMD5;
- break;
- case RPMSIGTAG_GPG:
- td.tag = RPMTAG_SIGGPG;
- break;
- case RPMSIGTAG_PGP5:
- td.tag = RPMTAG_SIGPGP5;
- break;
- case RPMSIGTAG_PAYLOADSIZE:
- td.tag = RPMTAG_ARCHIVESIZE;
- break;
- case RPMSIGTAG_FILESIGNATURES:
- td.tag = RPMTAG_FILESIGNATURES;
- break;
- case RPMSIGTAG_FILESIGNATURELENGTH:
- td.tag = RPMTAG_FILESIGNATURELENGTH;
- break;
- case RPMSIGTAG_SHA1:
- case RPMSIGTAG_SHA256:
- case RPMSIGTAG_DSA:
- case RPMSIGTAG_RSA:
- default:
- if (!(td.tag >= HEADER_SIGBASE && td.tag < HEADER_TAGBASE))
- continue;
- break;
- }
- if (!headerIsEntry(h, td.tag)) {
- switch (td.type) {
- case RPM_NULL_TYPE:
- continue;
+ rpmtdReset(&td);
+ for (xl = xlateTags; xl->stag; xl++) {
+ /* There mustn't be one in the main header */
+ if (headerIsEntry(h, xl->xtag))
+ if (headerGet(sigh, xl->stag, &td, HEADERGET_RAW|HEADERGET_MINMEM)) {
+ /* Translate legacy tags */
+ if (xl->stag != xl->xtag)
+ td.tag = xl->xtag;
+ /* Ensure type and tag size match expectations */
+ if (td.type != rpmTagGetTagType(td.tag))
break;
- case RPM_CHAR_TYPE:
- case RPM_INT8_TYPE:
- case RPM_INT16_TYPE:
- case RPM_INT32_TYPE:
- case RPM_INT64_TYPE:
- if (td.count != 1)
- continue;
+ if (td.count < 1 || td.count > 16*1024*1024)
break;
- case RPM_STRING_TYPE:
- case RPM_STRING_ARRAY_TYPE:
- case RPM_BIN_TYPE:
- if (td.count >= 16*1024)
- continue;
+ if (xl->count && td.count != xl->count)
break;
- case RPM_I18NSTRING_TYPE:
- continue;
+ if (!headerPut(h, &td, HEADERPUT_DEFAULT))
break;
- }
- (void) headerPut(h, &td, HEADERPUT_DEFAULT);
+ rpmtdFreeData(&td);
}
}
- headerFreeIterator(hi);
+ rpmtdFreeData(&td);
+
+ if (xl->stag) {
+ rasprintf(msg, "invalid signature tag %s (%d)",
+ rpmTagGetName(xl->xtag), xl->xtag);
+ }
+
+ return xl->stag;
}
/**
@@ -369,7 +354,8 @@ rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp)
goto exit;
/* Append (and remap) signature tags to the metadata. */
- headerMergeLegacySigs(h, sigh);
+ if (headerMergeLegacySigs(h, sigh, &msg))
+ goto exit;
applyRetrofits(h);
/* Bump reference count for return. */
--
1.8.3.1

View File

@ -1,64 +0,0 @@
From a4afbb62c94c6e0dc18c1bf08336aeb4a91f82de Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Wed, 22 Apr 2020 14:12:47 +0300
Subject: [PATCH] Don't look into source package provides in depsolving
Fixes regressions from commit 75ec16e660e784d7897b37cac1a2b9b135825f25:
the newly added provides of to-be-built packages were being used for
dependency resolution, such as spec satifying its own buildrequires,
and matched against conflicts in installed packages.
Source packages cannot obsolete anything or provide capabilities or files
to transactions, don't add them to rpmal at all. Explicitly skip checks
against source provides, similarly to what we already did with obsoletes.
Fixes: #1189
---
lib/depends.c | 8 ++++----
lib/rpmal.c | 4 ++++
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/lib/depends.c b/lib/depends.c
index 6acb21dc3..579451926 100644
--- a/lib/depends.c
+++ b/lib/depends.c
@@ -1040,6 +1040,10 @@ int rpmtsCheck(rpmts ts)
checkDS(ts, dcache, p, rpmteNEVRA(p), rpmteDS(p, RPMTAG_OBSOLETENAME),
tscolor);
+ /* Skip obsoletion and provides checks for source packages (ie build) */
+ if (rpmteIsSource(p))
+ continue;
+
/* Check provides against conflicts in installed packages. */
while (rpmdsNext(provides) >= 0) {
checkInstDeps(ts, dcache, p, RPMTAG_CONFLICTNAME, NULL, provides, 0);
@@ -1047,10 +1051,6 @@ int rpmtsCheck(rpmts ts)
checkInstDeps(ts, dcache, p, RPMTAG_REQUIRENAME, NULL, provides, 1);
}
- /* Skip obsoletion checks for source packages (ie build) */
- if (rpmteIsSource(p))
- continue;
-
/* Check package name (not provides!) against installed obsoletes */
checkInstDeps(ts, dcache, p, RPMTAG_OBSOLETENAME, NULL, rpmteDS(p, RPMTAG_NAME), 0);
diff --git a/lib/rpmal.c b/lib/rpmal.c
index 3c8acd63a..8a47d025a 100644
--- a/lib/rpmal.c
+++ b/lib/rpmal.c
@@ -247,6 +247,10 @@ void rpmalAdd(rpmal al, rpmte p)
rpmalNum pkgNum;
availablePackage alp;
+ /* Source packages don't provide anything to depsolving */
+ if (rpmteIsSource(p))
+ return;
+
if (al->size == al->alloced) {
al->alloced += al->delta;
al->list = xrealloc(al->list, sizeof(*al->list) * al->alloced);
--
2.27.0

View File

@ -1,31 +0,0 @@
From bb30f997c4b22c0d5cf6752f15d2af17538f91f0 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Thu, 9 Jan 2020 10:24:39 +0200
Subject: [PATCH] Don't require signature header to be in single contiguous
region part II
The generic case was reported in #270 and fixed quite a while ago in
commit 34c2ba3c6a80a778cdf2e42a9193b3264e08e1b3, but signing uses a
different code path and require the same treatment.
Fixes: #1002
---
lib/signature.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/signature.c b/lib/signature.c
index 6f04962e8..21f04c7f2 100644
--- a/lib/signature.c
+++ b/lib/signature.c
@@ -65,7 +65,7 @@ rpmRC rpmReadSignature(FD_t fd, Header * sighp, char ** msg)
if (sighp)
*sighp = NULL;
- if (hdrblobRead(fd, 1, 1, RPMTAG_HEADERSIGNATURES, &blob, &buf) != RPMRC_OK)
+ if (hdrblobRead(fd, 1, 0, RPMTAG_HEADERSIGNATURES, &blob, &buf) != RPMRC_OK)
goto exit;
/* OK, blob looks sane, load the header. */
--
2.27.0

View File

@ -1,218 +0,0 @@
From 307872f71b357a3839fd037514a1c3dabfacc611 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Mon, 3 Feb 2020 14:54:16 +0200
Subject: [PATCH] Fix POPT_ARG_STRING memleaks in librpmbuild
popt always returned malloc'ed memory for POPT_ARG_STRING items, but
for whatever historical reason rpm systematically passed const char *
pointers as targets, making them look non-freeable. Besides changing
just the types and adding free()'s, const-correctness requires extra
tweaks as there's mixed use from string literals and poptGetArg() which
does return const pointers.
---
build/parseDescription.c | 11 +++++++----
build/parseFiles.c | 5 +++--
build/parsePolicies.c | 5 +++--
build/parsePrep.c | 6 +++++-
build/parseScript.c | 11 +++++++----
build/policies.c | 8 ++++++--
6 files changed, 31 insertions(+), 15 deletions(-)
diff --git a/build/parseDescription.c b/build/parseDescription.c
index c0737c0..72811f5 100644
--- a/build/parseDescription.c
+++ b/build/parseDescription.c
@@ -19,8 +19,8 @@ int parseDescription(rpmSpec spec)
int rc, argc;
int arg;
const char **argv = NULL;
- const char *name = NULL;
- const char *lang = RPMBUILD_DEFAULT_LANG;
+ char *name = NULL;
+ char *lang = NULL;
const char *descr = "";
poptContext optCon = NULL;
struct poptOption optionsTable[] = {
@@ -52,7 +52,7 @@ int parseDescription(rpmSpec spec)
if (poptPeekArg(optCon)) {
if (name == NULL)
- name = poptGetArg(optCon);
+ name = xstrdup(poptGetArg(optCon));
if (poptPeekArg(optCon)) {
rpmlog(RPMLOG_ERR, _("line %d: Too many names: %s\n"),
spec->lineNum,
@@ -75,12 +75,15 @@ int parseDescription(rpmSpec spec)
}
if (addLangTag(spec, pkg->header,
- RPMTAG_DESCRIPTION, descr, lang)) {
+ RPMTAG_DESCRIPTION, descr,
+ lang ? lang : RPMBUILD_DEFAULT_LANG)) {
nextPart = PART_ERROR;
}
exit:
freeStringBuf(sb);
+ free(lang);
+ free(name);
free(argv);
poptFreeContext(optCon);
return nextPart;
diff --git a/build/parseFiles.c b/build/parseFiles.c
index 69935d4..0dc1f17 100644
--- a/build/parseFiles.c
+++ b/build/parseFiles.c
@@ -17,7 +17,7 @@ int parseFiles(rpmSpec spec)
int rc, argc;
int arg;
const char ** argv = NULL;
- const char *name = NULL;
+ char *name = NULL;
int flag = PART_SUBNAME;
poptContext optCon = NULL;
struct poptOption optionsTable[] = {
@@ -52,7 +52,7 @@ int parseFiles(rpmSpec spec)
if (poptPeekArg(optCon)) {
if (name == NULL)
- name = poptGetArg(optCon);
+ name = xstrdup(poptGetArg(optCon));
if (poptPeekArg(optCon)) {
rpmlog(RPMLOG_ERR, _("line %d: Too many names: %s\n"),
spec->lineNum,
@@ -89,6 +89,7 @@ int parseFiles(rpmSpec spec)
exit:
rpmPopMacro(NULL, "license");
free(argv);
+ free(name);
poptFreeContext(optCon);
return res;
diff --git a/build/parsePolicies.c b/build/parsePolicies.c
index 118b92c..64b95b1 100644
--- a/build/parsePolicies.c
+++ b/build/parsePolicies.c
@@ -19,7 +19,7 @@ int parsePolicies(rpmSpec spec)
int rc, argc;
int arg;
const char **argv = NULL;
- const char *name = NULL;
+ char *name = NULL;
int flag = PART_SUBNAME;
poptContext optCon = NULL;
@@ -50,7 +50,7 @@ int parsePolicies(rpmSpec spec)
if (poptPeekArg(optCon)) {
if (name == NULL)
- name = poptGetArg(optCon);
+ name = xstrdup(poptGetArg(optCon));
if (poptPeekArg(optCon)) {
rpmlog(RPMLOG_ERR, _("line %d: Too many names: %s\n"),
spec->lineNum, spec->line);
@@ -66,6 +66,7 @@ int parsePolicies(rpmSpec spec)
exit:
free(argv);
+ free(name);
poptFreeContext(optCon);
return res;
diff --git a/build/parsePrep.c b/build/parsePrep.c
index fe37575..cafb050 100644
--- a/build/parsePrep.c
+++ b/build/parsePrep.c
@@ -242,7 +242,7 @@ static int doSetupMacro(rpmSpec spec, const char *line)
int leaveDirs = 0, skipDefaultAction = 0;
int createDir = 0, quietly = 0;
int buildInPlace = 0;
- const char * dirName = NULL;
+ char * dirName = NULL;
struct poptOption optionsTable[] = {
{ NULL, 'a', POPT_ARG_STRING, NULL, 'a', NULL, NULL},
{ NULL, 'b', POPT_ARG_STRING, NULL, 'b', NULL, NULL},
@@ -373,6 +373,7 @@ exit:
freeStringBuf(before);
freeStringBuf(after);
poptFreeContext(optCon);
+ free(dirName);
free(argv);
return rc;
@@ -484,6 +485,9 @@ static rpmRC doPatchMacro(rpmSpec spec, const char *line)
exit:
argvFree(patchnums);
+ free(opt_b);
+ free(opt_d);
+ free(opt_o);
free(argv);
poptFreeContext(optCon);
return rc;
diff --git a/build/parseScript.c b/build/parseScript.c
index bdf6ab3..e037bba 100644
--- a/build/parseScript.c
+++ b/build/parseScript.c
@@ -100,9 +100,9 @@ int parseScript(rpmSpec spec, int parsePart)
int arg;
const char **argv = NULL;
poptContext optCon = NULL;
- const char *name = NULL;
- const char *prog = "/bin/sh";
- const char *file = NULL;
+ char *name = NULL;
+ char *prog = xstrdup("/bin/sh");
+ char *file = NULL;
int priority = 1000000;
struct poptOption optionsTable[] = {
{ NULL, 'p', POPT_ARG_STRING, &prog, 'p', NULL, NULL},
@@ -326,7 +326,7 @@ int parseScript(rpmSpec spec, int parsePart)
if (poptPeekArg(optCon)) {
if (name == NULL)
- name = poptGetArg(optCon);
+ name = xstrdup(poptGetArg(optCon));
if (poptPeekArg(optCon)) {
rpmlog(RPMLOG_ERR, _("line %d: Too many names: %s\n"),
spec->lineNum,
@@ -465,6 +465,9 @@ exit:
free(reqargs);
freeStringBuf(sb);
free(progArgv);
+ free(prog);
+ free(name);
+ free(file);
free(argv);
poptFreeContext(optCon);
diff --git a/build/policies.c b/build/policies.c
index d3b1930..e92df19 100644
--- a/build/policies.c
+++ b/build/policies.c
@@ -276,16 +276,20 @@ static rpmRC processPolicies(rpmSpec spec, Package pkg, int test)
}
if (writeModuleToHeader(mod, pkg) != RPMRC_OK) {
- freeModule(mod);
goto exit;
}
- freeModule(mod);
+ mod = freeModule(mod);
+ name = _free(name);
+ types = _free(types);
}
rc = RPMRC_OK;
exit:
+ freeModule(mod);
+ free(name);
+ free(types);
return rc;
}
--
2.27.0

View File

@ -1,39 +0,0 @@
From 4ddab4fb7e1ccc7dc466534250177b7d2682a9e2 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Wed, 29 Jan 2020 15:39:58 +0200
Subject: [PATCH] Fix a minor memory leak on suppressed inhibition lock warning
message
Commit 708e61307bc3fd027b016fdf5a1d1a5274c1843c introduced a memory leak
on the error object: if the message is suppressed then the error object
is never freed. Test for the suppression conditions separately to fix.
---
plugins/systemd_inhibit.c | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/plugins/systemd_inhibit.c b/plugins/systemd_inhibit.c
index 0ddca9cd8..ecff30533 100644
--- a/plugins/systemd_inhibit.c
+++ b/plugins/systemd_inhibit.c
@@ -52,12 +52,14 @@ static int inhibit(void)
dbus_message_unref(reply);
}
- if (dbus_error_is_set(&err)
- && !dbus_error_has_name(&err, DBUS_ERROR_NO_SERVER)
- && !dbus_error_has_name(&err, DBUS_ERROR_FILE_NOT_FOUND)) {
- rpmlog(RPMLOG_WARNING,
+ if (dbus_error_is_set(&err)) {
+ if (!dbus_error_has_name(&err, DBUS_ERROR_NO_SERVER) &&
+ !dbus_error_has_name(&err, DBUS_ERROR_FILE_NOT_FOUND))
+ {
+ rpmlog(RPMLOG_WARNING,
"Unable to get systemd shutdown inhibition lock: %s\n",
err.message);
+ }
dbus_error_free(&err);
}
--
2.27.0

View File

@ -1,35 +0,0 @@
From 67f8dadebdf290c4ade36a7d3a27e52048d96032 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Tue, 4 Feb 2020 10:36:43 +0200
Subject: [PATCH] Fix build regression in commit
307872f71b357a3839fd037514a1c3dabfacc611
Commit 307872f71b357a3839fd037514a1c3dabfacc611 broke build with
SELinux enabled but was accidentally merged. Fix the breakage.
---
build/policies.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build/policies.c b/build/policies.c
index e92df194a..16d5f87e6 100644
--- a/build/policies.c
+++ b/build/policies.c
@@ -221,6 +221,7 @@ static rpmRC processPolicies(rpmSpec spec, Package pkg, int test)
char *types = NULL;
uint32_t flags = 0;
poptContext optCon = NULL;
+ ModuleRec mod = NULL;
rpmRC rc = RPMRC_FAIL;
@@ -236,7 +237,6 @@ static rpmRC processPolicies(rpmSpec spec, Package pkg, int test)
}
for (ARGV_const_t pol = pkg->policyList; *pol != NULL; pol++) {
- ModuleRec mod;
const char *line = *pol;
const char **argv = NULL;
int argc = 0;
--
2.27.0

View File

@ -1,60 +0,0 @@
From 486579912381ede82172dc6d0ff3941a6d0536b5 Mon Sep 17 00:00:00 2001
From: Hongxu Jia <hongxu.jia@windriver.com>
Date: Wed, 3 Jun 2020 10:25:24 +0800
Subject: [PATCH] Fix: bump up the limit of signature header to 64MB
Since commits [Place file signatures into the signature header where they
belong][1] applied, run `rpm -Kv **.rpm' failed if signature header
is larger than 64KB. Here are steps:
1) A unsigned rpm package, the size is 227560 bytes
$ ls -al xz-src-5.2.5-r0.corei7_64.rpm
-rw-------. 1 mockbuild 1000 227560 Jun 3 09:59
2) Sign the rpm package
$ rpmsign --addsign ... xz-src-5.2.5-r0.corei7_64.rpm
3) The size of signed rpm is 312208 bytes
$ ls -al xz-src-5.2.5-r0.corei7_64.rpm
-rw-------. 1 mockbuild 1000 312208 Jun 3 09:48
4) Run `rpm -Kv' failed with signature hdr data out of range
$ rpm -Kv xz-src-5.2.5-r0.corei7_64.rpm
xz-src-5.2.5-r0.corei7_64.rpm:
error: xz-src-5.2.5-r0.corei7_64.rpm: signature hdr data: BAD, no. of
bytes(88864) out of range
From 1) and 3), the size of signed rpm package increased
312208 - 227560 = 84648, so the check of dl_max (64KB,65536)
is not enough.
As [1] said:
This also means the signature header can be MUCH bigger than ever
before,so bump up the limit (to 64MB, arbitrary something for now)
So [1] missed to multiply by 1024.
[1] https://github.com/rpm-software-management/rpm/commit/f558e886050c4e98f6cdde391df679a411b3f62c
Signed-off-by: Hongxu Jia <hongxu.jia@windriver.com>
---
lib/header.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/header.c b/lib/header.c
index f9152ba90..e59d63744 100644
--- a/lib/header.c
+++ b/lib/header.c
@@ -1903,7 +1903,7 @@ rpmRC hdrblobRead(FD_t fd, int magic, int exact_size, rpmTagVal regionTag, hdrbl
if (regionTag == RPMTAG_HEADERSIGNATURES) {
il_max = 32;
- dl_max = 64 * 1024;
+ dl_max = 64 * 1024 * 1024;
}
memset(block, 0, sizeof(block));
--
2.27.0

View File

@ -1,98 +0,0 @@
From a58725822651f791b2e74fe40a6e85b3b7e72aca Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Mon, 10 Aug 2020 11:01:37 +0300
Subject: [PATCH] Fix changelog trimming to work relative to newest
existing
entry (#1301)
%_changelog_trimtime is an absolute timestamp which needs to be
%constantly
pushed forward to preserve the same relative age, and will start
trimming
entries from unchanged packages until none are left, leading to
unexpected
and confusing behavior (RhBug:1722806, ...)
It's better to trim by age relative to newest changelog entry. This way
the
number of trimmed entries will not change unless the spec changes, and
at
least one entry is always preserved. Introduce a new %_changelog_trimage
macro for this and mark the broken by design %_changelog_trimtime as
deprecated, but autoconvert an existing trimtime into relative for now.
As a seemingly unrelated change, move the "time" variable declaration
to a narrower scope to unmask the time() function for use on entry.
Fixes: #1301
---
build/parseChangelog.c | 16 +++++++++++++++-
macros.in | 6 +++++-
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/build/parseChangelog.c b/build/parseChangelog.c
index ad6d834..22f445e 100644
--- a/build/parseChangelog.c
+++ b/build/parseChangelog.c
@@ -200,18 +200,26 @@ static rpmRC addChangelog(Header h, ARGV_const_t sb)
rpmRC rc = RPMRC_FAIL; /* assume failure */
char *s, *sp;
int i;
- time_t time;
+ time_t firstTime = 0;
time_t lastTime = 0;
time_t trimtime = rpmExpandNumeric("%{?_changelog_trimtime}");
+ time_t trimage = rpmExpandNumeric("%{?_changelog_trimage}");
char *date, *name, *text, *next;
int date_words; /* number of words in date string */
+ /* Convert _changelog_trimtime to age for backwards compatibility */
+ if (trimtime && !trimage) {
+ trimage = time(NULL) - trimtime;
+ trimtime = 0;
+ }
+
s = sp = argvJoin(sb, "");
/* skip space */
SKIPSPACE(s);
while (*s != '\0') {
+ time_t time;
if (*s != '*') {
rpmlog(RPMLOG_ERR, _("%%changelog entries must start with *\n"));
goto exit;
@@ -235,6 +243,12 @@ static rpmRC addChangelog(Header h, ARGV_const_t sb)
rpmlog(RPMLOG_ERR, _("bad date in %%changelog: %s\n"), date);
goto exit;
}
+ /* Changelog trimming is always relative to first entry */
+ if (!firstTime) {
+ firstTime = time;
+ if (trimage)
+ trimtime = firstTime - trimage;
+ }
if (lastTime && lastTime < time) {
rpmlog(RPMLOG_ERR,
_("%%changelog not in descending chronological order\n"));
diff --git a/macros.in b/macros.in
index 8619c13..5b45d73 100644
--- a/macros.in
+++ b/macros.in
@@ -230,8 +230,12 @@ package or when debugging this package.\
# The path to the gzip executable (legacy, use %{__gzip} instead).
%_gzipbin %{__gzip}
+# Maximum age of preserved changelog entries in binary packages,
+# relative to newest existing entry. Unix timestamp format.
+%_changelog_trimage 0
+
# The Unix time of the latest kept changelog entry in binary packages.
-# Any older entry is not packaged in binary packages.
+# DEPRACATED, use %_changelog_trimage instead.
%_changelog_trimtime 0
# If true, set the SOURCE_DATE_EPOCH environment variable
--
2.27.0

View File

@ -1,32 +0,0 @@
From c9bb0c30d0eab5ff7db80d920d40c02623732f71 Mon Sep 17 00:00:00 2001
From: Tom Stellard <tstellar@redhat.com>
Date: Tue, 9 Jun 2020 21:05:16 +0000
Subject: [PATCH] Fix data race in packageBinaries() function
The pkg variable used in the parallel loop was declared outside
of the omp parallel construct, so it was shared among tasks. This
had the potential to cause a data race. The gcc openmp implementation
did not hit this problem, but I uncovered it while trying to compile with
clang. My best guess as to what was happening is that after the last
task was launched, all tasks had the same value of pkg and were operating
on the same data at the same time.
This patch declares the variable inside the omp parallel construct, so each
task gets its own copy of the variable.
---
build/pack.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/build/pack.c b/build/pack.c
index 1f3d432bb3..8d6f74935e 100644
--- a/build/pack.c
+++ b/build/pack.c
@@ -765,7 +765,7 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
#pragma omp parallel
#pragma omp single
for (int i = 0; i < npkgs; i++) {
- pkg = tasks[i];
+ Package pkg = tasks[i];
#pragma omp task untied priority(i)
{
pkg->rc = packageBinary(spec, pkg, cookie, cheating, &pkg->filename);

View File

@ -1,41 +0,0 @@
From d937b04fb1cb5d3ca303bd458169c352a4b52669 Mon Sep 17 00:00:00 2001
From: Florian Festi <ffesti@redhat.com>
Date: Fri, 31 Jan 2020 12:27:26 +0100
Subject: [PATCH] Fix isUnorderedReq() for multiple qualifiers
isUnorderedReq() returned True as soon as any qualifier that does not
require ordering is passed. But some qulifiers - basically the scriptlets
run during installation and erasure of the package - may still require
the dependency to be taken into account during ordering.
Now isUnorderedReq() returns 0 if any of those are also set.
Resolves: #1030
---
lib/rpmds.h | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/lib/rpmds.h b/lib/rpmds.h
index 491d8738d..d160c948e 100644
--- a/lib/rpmds.h
+++ b/lib/rpmds.h
@@ -82,12 +82,14 @@ typedef rpmFlags rpmsenseFlags;
_notpre(RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN)
#define _UNORDERED_ONLY_MASK \
_notpre(RPMSENSE_RPMLIB|RPMSENSE_CONFIG|RPMSENSE_PRETRANS|RPMSENSE_POSTTRANS|RPMSENSE_SCRIPT_VERIFY)
+#define _FORCE_ORDER_ONLY_MASK \
+ _notpre(RPMSENSE_SCRIPT_PRE|RPMSENSE_SCRIPT_POST|RPMSENSE_SCRIPT_PREUN|RPMSENSE_SCRIPT_POSTUN)
#define isLegacyPreReq(_x) (((_x) & _ALL_REQUIRES_MASK) == RPMSENSE_PREREQ)
#define isInstallPreReq(_x) ((_x) & _INSTALL_ONLY_MASK)
#define isErasePreReq(_x) ((_x) & _ERASE_ONLY_MASK)
-#define isUnorderedReq(_x) ((_x) & _UNORDERED_ONLY_MASK)
-
+#define isUnorderedReq(_x) ((_x) & _UNORDERED_ONLY_MASK && \
+ !((_x) & _FORCE_ORDER_ONLY_MASK))
/** \ingroup rpmds
--
2.27.0

View File

@ -1,54 +0,0 @@
From 6d7fa91949337c7a86bab3359b39558fdae07dce Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Fri, 23 Oct 2020 14:02:35 +0200
Subject: [PATCH] Fix logic error in grabArgs()
If there was a \ at the end of the buffer, the code would
return a pointer after the trailing \0 leading to unallocated
memory access and weird results in some cases.
See commit 817959609b95afe34ce0f7f6c3dc5d7d0d9a8470.
---
rpmio/macro.c | 2 +-
tests/rpmmacro.at | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/rpmio/macro.c b/rpmio/macro.c
index 1edcb39e6..a1ed9b288 100644
--- a/rpmio/macro.c
+++ b/rpmio/macro.c
@@ -947,7 +947,7 @@ grabArgs(MacroBuf mb, const rpmMacroEntry me, const char * se,
splitQuoted(&argv, s, " \t");
free(s);
- cont = ((*lastc == '\0' || *lastc == '\n') && *(lastc-1) != '\\') ?
+ cont = (*lastc == '\0') || (*lastc == '\n' && *(lastc-1) != '\\') ?
lastc : lastc + 1;
}
diff --git a/tests/rpmmacro.at b/tests/rpmmacro.at
index d972a1197..a21952c46 100644
--- a/tests/rpmmacro.at
+++ b/tests/rpmmacro.at
@@ -179,6 +179,9 @@ runroot rpm \
--eval '%foo %{quote: 2 3 5} %{quote:%{nil}}' \
--eval '%foo x%{quote:y}z 123' \
--eval '%foo x%{quote:%{nil}}z' \
+ --eval '%foo 1 \
+bar' \
+ --eval '%foo 1 \' \
],
[0],
[1:"1"
@@ -190,6 +193,8 @@ runroot rpm \
2:" 2 3 5" ""
2:"xyz" "123"
1:"xz"
+2:"1" "\"bar
+2:"1" "\"
])
AT_CLEANUP
--
2.27.0

View File

@ -1,33 +0,0 @@
From c886b359ba5f05eec6a8da34b55437834b7d80ee Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Thu, 6 Feb 2020 14:51:14 +0200
Subject: [PATCH] Fix pointer dereference before testing for NULL in
rpmtdGetNumber()
---
lib/rpmtd.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/rpmtd.c b/lib/rpmtd.c
index e33c8cb53..41c6a50e8 100644
--- a/lib/rpmtd.c
+++ b/lib/rpmtd.c
@@ -210,12 +210,12 @@ const char * rpmtdGetString(rpmtd td)
uint64_t rpmtdGetNumber(rpmtd td)
{
- uint64_t val = 0;
- int ix = (td->ix >= 0 ? td->ix : 0);
-
if (td == NULL)
return 0;
+ uint64_t val = 0;
+ int ix = (td->ix >= 0 ? td->ix : 0);
+
switch (td->type) {
case RPM_INT64_TYPE:
val = *((uint64_t *) td->data + ix);
--
2.27.0

View File

@ -1,40 +0,0 @@
From 747b7119ae89a3ccaceeae4f5570c7ab83d2cf5d Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Tue, 1 Sep 2020 13:14:35 +0300
Subject: [PATCH] Fix possible read beyond buffer in rstrnlenhash()
On strings that are not \0-terminated (which are a big reason for the
existence of this function), the while-loop would try to compare the
first character beyond the specified buffer for '\0' before realizing
we're already beyond the end when checking n. Should be mostly harmless
in practise as the check for n would still terminate it, but not right.
In particular this trips up address sanitizer with the bdb backend where
some of the returned strings are not \0-terminated.
Test for string length first, and move the decrementing side-effect into
the loop for better readability.
---
rpmio/rpmstrpool.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/rpmio/rpmstrpool.c b/rpmio/rpmstrpool.c
index 776ca6dea..0db0b5313 100644
--- a/rpmio/rpmstrpool.c
+++ b/rpmio/rpmstrpool.c
@@ -88,11 +88,12 @@ static inline unsigned int rstrnlenhash(const char * str, size_t n, size_t * len
unsigned int hash = 0xe4721b68;
const char * s = str;
- while (*s != '\0' && n-- > 0) {
+ while (n > 0 && *s != '\0') {
hash += *s;
hash += (hash << 10);
hash ^= (hash >> 6);
s++;
+ n--;
}
hash += (hash << 3);
hash ^= (hash >> 11);
--
2.27.0

View File

@ -1,29 +0,0 @@
From 85e5a70368854da0537099128530b0df69ca2216 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Wed, 29 Jan 2020 13:58:16 +0200
Subject: [PATCH] Fix regression on v3 package handling on database rebuild
Introduced in commit 27ea3f8624560bd158fc7bc801639310a0ffab10, the
wrong header is being added in case of v3 packages.
Fixes: #1017
---
lib/rpmdb.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/rpmdb.c b/lib/rpmdb.c
index 7ae67563f..91543eb68 100644
--- a/lib/rpmdb.c
+++ b/lib/rpmdb.c
@@ -2557,7 +2557,7 @@ int rpmdbRebuild(const char * prefix, rpmts ts,
/* Deleted entries are eliminated in legacy headers by copy. */
if (headerIsEntry(h, RPMTAG_HEADERIMAGE)) {
Header nh = headerReload(headerCopy(h), RPMTAG_HEADERIMAGE);
- rc = rpmdbAdd(newdb, h);
+ rc = rpmdbAdd(newdb, nh);
headerFree(nh);
} else {
rc = rpmdbAdd(newdb, h);
--
2.27.0

View File

@ -1,49 +0,0 @@
From 6b18e76f3db5dd3db5a468c947309322d8bc11aa Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Thu, 21 Nov 2019 12:22:45 +0200
Subject: [PATCH] Fix resource leaks on zstd open error paths
If zstd stream initialization fails, the opened fd and the stream
itself are leaked. Handle error exit in a central label.
---
rpmio/rpmio.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c
index 243942411..10ba20cd6 100644
--- a/rpmio/rpmio.c
+++ b/rpmio/rpmio.c
@@ -1128,13 +1128,13 @@ static rpmzstd rpmzstdNew(int fdno, const char *fmode)
if ((flags & O_ACCMODE) == O_RDONLY) { /* decompressing */
if ((_stream = (void *) ZSTD_createDStream()) == NULL
|| ZSTD_isError(ZSTD_initDStream(_stream))) {
- return NULL;
+ goto err;
}
nb = ZSTD_DStreamInSize();
} else { /* compressing */
if ((_stream = (void *) ZSTD_createCStream()) == NULL
|| ZSTD_isError(ZSTD_initCStream(_stream, level))) {
- return NULL;
+ goto err;
}
nb = ZSTD_CStreamOutSize();
}
@@ -1149,6 +1149,14 @@ static rpmzstd rpmzstdNew(int fdno, const char *fmode)
zstd->b = xmalloc(nb);
return zstd;
+
+err:
+ fclose(fp);
+ if ((flags & O_ACCMODE) == O_RDONLY)
+ ZSTD_freeDStream(_stream);
+ else
+ ZSTD_freeCStream(_stream);
+ return NULL;
}
static FD_t zstdFdopen(FD_t fd, int fdno, const char * fmode)
--
2.27.0

View File

@ -1,48 +0,0 @@
From 83a5a20352dccd336a0114238c5988f0a9fa6d3e Mon Sep 17 00:00:00 2001
From: Denys Vlasenko <dvlasenk@redhat.com>
Date: Thu, 23 Jan 2020 14:21:26 +0100
Subject: [PATCH] If fork fails in getOutputFrom(), close opened unused pipe
fds on error code path
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
---
build/rpmfc.c | 16 +++++++++++-----
1 file changed, 11 insertions(+), 5 deletions(-)
diff --git a/build/rpmfc.c b/build/rpmfc.c
index f5f3793b9..81101518b 100644
--- a/build/rpmfc.c
+++ b/build/rpmfc.c
@@ -277,6 +277,17 @@ static int getOutputFrom(ARGV_t argv,
}
child = fork();
+ if (child < 0) {
+ rpmlog(RPMLOG_ERR, _("Couldn't fork %s: %s\n"),
+ argv[0], strerror(errno));
+ if (doio) {
+ close(toProg[1]);
+ close(toProg[0]);
+ close(fromProg[0]);
+ close(fromProg[1]);
+ }
+ return -1;
+ }
if (child == 0) {
close(toProg[1]);
close(fromProg[0]);
@@ -299,11 +310,6 @@ static int getOutputFrom(ARGV_t argv,
argv[0], strerror(errno));
_exit(EXIT_FAILURE);
}
- if (child < 0) {
- rpmlog(RPMLOG_ERR, _("Couldn't fork %s: %s\n"),
- argv[0], strerror(errno));
- return -1;
- }
if (!doio)
goto reap;
--
2.27.0

View File

@ -1,31 +0,0 @@
From d1dee9c00af418004f578a97e9b794676daf6d37 Mon Sep 17 00:00:00 2001
From: Matthew Almond <malmond@fb.com>
Date: Mon, 28 Sep 2020 12:41:22 -0700
Subject: [PATCH] Make fdSeek return 0 on success, -1 on error
This code eliminates a false positive failure when the destination
position is > 2GiB. This is done by changing the contract for `Fseek`.
Now it returns `0` on success instead of an `int` offset.
Care should be used to interpret the result as there is a difference in
semantics between the POSIX `fseek(2)`. Existing code is correct: negative
results are still failures.
---
rpmio/rpmio.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rpmio/rpmio.c b/rpmio/rpmio.c
index 10a28a923..9f4a60aa1 100644
--- a/rpmio/rpmio.c
+++ b/rpmio/rpmio.c
@@ -382,7 +382,7 @@ static ssize_t fdWrite(FDSTACK_t fps, const void * buf, size_t count)
static int fdSeek(FDSTACK_t fps, off_t pos, int whence)
{
- return lseek(fps->fdno, pos, whence);
+ return (lseek(fps->fdno, pos, whence) == -1) ? -1 : 0;
}
static int fdClose(FDSTACK_t fps)
--
2.27.0

View File

@ -1,33 +0,0 @@
From 92a78e6acf3f056faccebb25a9d310ee96f8015d Mon Sep 17 00:00:00 2001
From: Cerul Alain <ae@metaeducation.com>
Date: Mon, 13 Jul 2020 00:34:42 -0400
Subject: [PATCH] Remove compare of global array tagsByName to NULL
A 2016 change (57a96d2486c26142ebb168a1f00b0374d35bf044) apparently
changed tagsByName from dynamic allocation to being static, so that
Valgrind would not complain about lost memory. The definition is:
static headerTagTableEntry tagsByName[TABLESIZE];
But a comparison was left of `tagsByName == NULL` in lib/tagname.c
and compiling with clang gives a warning, saying it is never NULL.
---
lib/tagname.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/tagname.c b/lib/tagname.c
index 68b252991..4efd847eb 100644
--- a/lib/tagname.c
+++ b/lib/tagname.c
@@ -234,7 +234,7 @@ int rpmTagGetNames(rpmtd tagnames, int fullname)
pthread_once(&tagsLoaded, loadTags);
- if (tagnames == NULL || tagsByName == NULL)
+ if (tagnames == NULL)
return 0;
rpmtdReset(tagnames);
--
2.27.0

View File

@ -1,101 +0,0 @@
From 3c061be6aeaec1be793b406fac9f667dc5d1429b Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Wed, 4 Mar 2020 11:15:02 +0200
Subject: [PATCH] Use libelf for determining file colors
libmagic strings are notoriously unreliable as the details from version
to version. We link to libelf anyway so we might as well as get the
info straight from the horse's mouth.
Besides being more reliable, this detaches the coloring business from
the hardcoded rpmfcTokens struct and informative-only FILECLASS
contents,
opening the door for other changes in that area.
---
build/rpmfc.c | 35 +++++++++++++++++++++++++++++------
1 file changed, 29 insertions(+), 6 deletions(-)
diff --git a/build/rpmfc.c b/build/rpmfc.c
index aaa0dca..0886616 100644
--- a/build/rpmfc.c
+++ b/build/rpmfc.c
@@ -7,6 +7,7 @@
#include <signal.h>
#include <magic.h>
#include <regex.h>
+#include <gelf.h>
#include <rpm/header.h>
#include <rpm/argv.h>
@@ -595,7 +596,7 @@ exit:
return rc;
}
-/* Only used for elf coloring and controlling RPMTAG_FILECLASS inclusion now */
+/* Only used for controlling RPMTAG_FILECLASS inclusion now */
static const struct rpmfcTokens_s rpmfcTokens[] = {
{ "directory", RPMFC_INCLUDE },
@@ -1076,6 +1077,29 @@ static int initAttrs(rpmfc fc)
return nattrs;
}
+static uint32_t getElfColor(const char *fn)
+{
+ uint32_t color = 0;
+ int fd = open(fn, O_RDONLY);
+ if (fd >= 0) {
+ Elf *elf = elf_begin (fd, ELF_C_READ, NULL);
+ GElf_Ehdr ehdr;
+ if (elf && gelf_getehdr(elf, &ehdr)) {
+ switch (ehdr.e_ident[EI_CLASS]) {
+ case ELFCLASS64:
+ color = RPMFC_ELF64;
+ break;
+ case ELFCLASS32:
+ color = RPMFC_ELF32;
+ break;
+ }
+ elf_end(elf);
+ }
+ close(fd);
+ }
+ return color;
+}
+
rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
{
int msflags = MAGIC_CHECK | MAGIC_COMPRESS | MAGIC_NO_CHECK_TOKENS;
@@ -1187,8 +1211,6 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
/* Add attributes based on file type and/or path */
rpmfcAttributes(fc, ix, ftype, s);
- fc->fcolor[ix] = fcolor;
-
/* Add to file class dictionary and index array */
#pragma omp ordered
if (fcolor != RPMFC_WHITE && (fcolor & RPMFC_INCLUDE)) {
@@ -1202,6 +1224,10 @@ rpmRC rpmfcClassify(rpmfc fc, ARGV_t argv, rpm_mode_t * fmode)
}
/* Pool id's start from 1, for headers we want it from 0 */
fc->fcdictx[ix] = ftypeId - 1;
+
+ /* Add ELF colors */
+ if (S_ISREG(mode) && is_executable)
+ fc->fcolor[ix] = getElfColor(s);
}
if (ms != NULL)
@@ -1493,9 +1519,6 @@ rpmRC rpmfcGenerateDepends(const rpmSpec spec, Package pkg)
goto exit;
/* Add per-file colors(#files) */
- /* XXX Make sure only primary (i.e. Elf32/Elf64) colors are added. */
- for (int i = 0; i < fc->nfiles; i++)
- fc->fcolor[i] &= 0x0f;
headerPutUint32(pkg->header, RPMTAG_FILECOLORS, fc->fcolor, fc->nfiles);
/* Add classes(#classes) */
--
2.27.0

View File

@ -0,0 +1,29 @@
From 7b3a3f004f96ed3cb9cc377f7e64bfc88195dfc2 Mon Dec 13 16:41:34 2021
From: From: Florian Festi <ffesti@redhat.com>
Date: Mon, 13 Dec 2021 16:41:34 +0800
Subject: [PATCH] Use root as default UID_0_USER and UID_0_GROUP
If /etc/passwd or /etc/group was not available during building rpm itself
these ended up empty. This affects builds done later on using rpmbuild.
Resolves: #1838
---
configure.ac | 2 ++
1 file changed, 2 insertions(+)
diff --git a/configure.ac b/configure.ac
index cdaf2b6..8656043 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1050,6 +1050,8 @@ fi
user_with_uid0=$(awk -F: '$3==0 {print $1;exit}' /etc/passwd)
group_with_gid0=$(awk -F: '$3==0 {print $1;exit}' /etc/group)
+if test -z "$user_with_uid0" ; then user_with_uid0=root ; fi
+if test -z "$group_with_gid0" ; then group_with_gid0=root ; fi
AC_DEFINE_UNQUOTED([UID_0_USER],["$user_with_uid0"],[Get the user name having userid 0])
AC_DEFINE_UNQUOTED([GID_0_GROUP],["$group_with_gid0"],[Get the group name having groupid 0])
--
1.8.3.1

View File

@ -1,132 +0,0 @@
From 6f6f5e70f16bef21523c3e2f19e7557bfcaa2546 Mon Sep 17 00:00:00 2001
From: Michal Domonkos <mdomonko@redhat.com>
Date: Tue, 21 Apr 2020 11:38:25 +0200
Subject: [PATCH] build: prioritize large packages
Binary packages come in different sizes and so their build time can vary
greatly. Dynamic scheduling, which we currently use for parallel
building, is a good strategy to combat such differences and load-balance
the available CPU cores.
That said, knowing that the build time of a package is proportional to
its size, we can reduce the overall time even further by cleverly
ordering the task queue.
As an example, consider a set of 5 packages, 4 of which take 1 unit of
time to build and one takes 4 units. If we were to build these on a
dual-core system, one possible unit distribution would look like this:
TIME --->
CPU 1 * * * * * * # package 1, 3 and 5
CPU 2 * * # package 2 and 4
Now, compare that to a different distribution where the largest package
5 gets built early on:
TIME --->
CPU 1 * * * * # package 5
CPU 2 * * * * # package 1, 2, 3 and 4
It's obvious that processing the largest packages first gives better
results when dealing with such a mix of small and large packages
(typically a regular package and its debuginfo counterpart,
respectively).
Now, with dynamic scheduling in OpenMP, we cannot directly control the
task queue; we can only generate the tasks and let the runtime system do
its work. What we can do, however, is to provide a hint to the runtime
system for the desired ordering, using the "priority" clause.
So, in this commit, we use the clause to assign a priority value to each
build task based on the respective package size (the bigger the size,
the higher the priority), to help achieve an optimal execution order.
Indeed, in my testing, the priorities were followed to the letter (but
remember, that's not guaranteed by the specification). Interestingly,
even without the use of priorities, simply generating the tasks in the
desired order resulted in the same execution order for me, but that's,
again, just an implementation detail.
Also note that OpenMP is allowed to stop the thread generating the tasks
at any time, and make it execute some of the tasks instead. If the
chosen task happens to be a long-duration one, we might hit a starvation
scenario where the other threads have exhausted the task queue and
there's nobody to generate new tasks. To counter that, this commit also
adds the "untied" clause which allows other threads to pick up where the
generating thread left off, and continue generating new tasks.
Resolves #1045.
---
build/pack.c | 38 +++++++++++++++++++++++++++++++++++---
1 file changed, 35 insertions(+), 3 deletions(-)
diff --git a/build/pack.c b/build/pack.c
index a44a3fe9c8..bc40683c4f 100644
--- a/build/pack.c
+++ b/build/pack.c
@@ -6,6 +6,7 @@
#include "system.h"
#include <errno.h>
+#include <stdlib.h>
#include <sys/wait.h>
#include <rpm/rpmlib.h> /* RPMSIGTAG*, rpmReadPackageFile */
@@ -726,16 +727,45 @@ static rpmRC packageBinary(rpmSpec spec, Package pkg, const char *cookie, int ch
return rc;
}
+static int compareBinaries(const void *p1, const void *p2) {
+ Package pkg1 = *(Package *)p1;
+ Package pkg2 = *(Package *)p2;
+ uint64_t size1 = headerGetNumber(pkg1->header, RPMTAG_LONGSIZE);
+ uint64_t size2 = headerGetNumber(pkg2->header, RPMTAG_LONGSIZE);
+ if (size1 > size2)
+ return -1;
+ if (size1 < size2)
+ return 1;
+ return 0;
+}
+
+/*
+ * Run binary creation in parallel, with task priority based on package size
+ * (largest first) to help achieve an optimal load distribution.
+ */
rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
{
rpmRC rc = RPMRC_OK;
Package pkg;
+ Package *tasks;
+ int npkgs = 0;
+
+ for (pkg = spec->packages; pkg != NULL; pkg = pkg->next)
+ npkgs++;
+ tasks = xcalloc(npkgs, sizeof(Package));
+
+ pkg = spec->packages;
+ for (int i = 0; i < npkgs; i++) {
+ tasks[i] = pkg;
+ pkg = pkg->next;
+ }
+ qsort(tasks, npkgs, sizeof(Package), compareBinaries);
- /* Run binary creation in parallel */
#pragma omp parallel
#pragma omp single
- for (pkg = spec->packages; pkg != NULL; pkg = pkg->next) {
- #pragma omp task
+ for (int i = 0; i < npkgs; i++) {
+ pkg = tasks[i];
+ #pragma omp task untied priority(i)
{
pkg->rc = packageBinary(spec, pkg, cookie, cheating, &pkg->filename);
rpmlog(RPMLOG_DEBUG,
@@ -754,6 +784,8 @@ rpmRC packageBinaries(rpmSpec spec, const char *cookie, int cheating)
if (rc == RPMRC_OK)
checkPackageSet(spec->packages);
+ free(tasks);
+
return rc;
}

View File

@ -1,29 +0,0 @@
From c464f1ece501346da11ed7582b8d46682363a285 Mon Sep 17 00:00:00 2001
From: Thierry Vignaud <tvignaud@redhat.com>
Date: Mon, 23 Dec 2019 16:51:49 +0100
Subject: [PATCH] fix zstd magic
I spot it while adding support for zstd compressed metadata in
URPM/urpmi, which was broken by this typo
typo introduced in commit 3684424fe297c996bb05bb64631336fa2903df12
---
rpmio/rpmfileutil.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rpmio/rpmfileutil.c b/rpmio/rpmfileutil.c
index bda97adf1..84ee34f4d 100644
--- a/rpmio/rpmfileutil.c
+++ b/rpmio/rpmfileutil.c
@@ -188,7 +188,7 @@ int rpmFileIsCompressed(const char * file, rpmCompressedMagic * compressed)
(magic[4] == 0x5a) && (magic[5] == 0x00)) {
/* new style xz (lzma) with magic */
*compressed = COMPRESSED_XZ;
- } else if ((magic[0] == 0x28) && (magic[1] == 0x85) &&
+ } else if ((magic[0] == 0x28) && (magic[1] == 0xB5) &&
(magic[2] == 0x2f) ) {
*compressed = COMPRESSED_ZSTD;
} else if ((magic[0] == 'L') && (magic[1] == 'Z') &&
--
2.27.0

View File

@ -1,28 +0,0 @@
From 52c3ee60a1ce0e7e527dc396dd1e1a0e29b7b0ed Mon Sep 17 00:00:00 2001
From: Michael Schroeder <mls@suse.de>
Date: Fri, 10 Jan 2020 15:47:13 +0100
Subject: [PATCH] ndb: only clear the dbenv in the rpmdb if the last reference
is gone
Otherwise we will segfault if just one index is closed.
---
lib/backend/ndb/glue.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/lib/backend/ndb/glue.c b/lib/backend/ndb/glue.c
index 376e360e3..841c2fe42 100644
--- a/lib/backend/ndb/glue.c
+++ b/lib/backend/ndb/glue.c
@@ -52,8 +52,8 @@ static void closeEnv(rpmdb rdb)
if (ndbenv->data)
free(ndbenv->data);
free(ndbenv);
+ rdb->db_dbenv = 0;
}
- rdb->db_dbenv = 0;
}
static struct ndbEnv_s *openEnv(rpmdb rdb)
--
2.27.0

View File

@ -1,42 +0,0 @@
From a427c3cd2776bc523bd40491a5d92d98d071ffea Mon Sep 17 00:00:00 2001
From: Demi Marie Obenour <athena@invisiblethingslab.com>
Date: Tue, 16 Mar 2021 11:41:16 +0200
Subject: [PATCH] Optimize signature header merge a bit
Look up possible offending tags from the main header first in a separate
loop, this avoids having to re-sort after each headerPut() operation
---
lib/package.c | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/lib/package.c b/lib/package.c
index 6f10bb9..355c3e7 100644
--- a/lib/package.c
+++ b/lib/package.c
@@ -64,10 +64,14 @@ rpmTagVal headerMergeLegacySigs(Header h, Header sigh, char **msg)
{
const struct taglate_s *xl;
struct rpmtd_s td;
- rpmtdReset(&td);
for (xl = xlateTags; xl->stag; xl++) {
/* There mustn't be one in the main header */
if (headerIsEntry(h, xl->xtag))
+ goto exit;
+ }
+
+ rpmtdReset(&td);
+ for (xl = xlateTags; xl->stag; xl++) {
if (headerGet(sigh, xl->stag, &td, HEADERGET_RAW|HEADERGET_MINMEM)) {
/* Translate legacy tags */
if (xl->stag != xl->xtag)
@@ -86,6 +90,7 @@ rpmTagVal headerMergeLegacySigs(Header h, Header sigh, char **msg)
}
rpmtdFreeData(&td);
+exit:
if (xl->stag) {
rasprintf(msg, "invalid signature tag %s (%d)",
rpmTagGetName(xl->xtag), xl->xtag);
--
2.27.0

View File

@ -1,47 +0,0 @@
From f34030816d84dfbf52f259404b32b81e53c21fbb Mon Sep 17 00:00:00 2001
From: Jes Sorensen <jsorensen@fb.com>
Date: Fri, 3 Apr 2020 14:09:18 -0400
Subject: [PATCH] rpmfiArchiveRead() use signed return value to handle -1 on
error
size_t is unsigned, so returning -1 is not going to have the expected
behavior. Fix it to return ssize_t.
Signed-off-by: Jes Sorensen <jsorensen@fb.com>
---
lib/rpmarchive.h | 4 ++--
lib/rpmfi.c | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/lib/rpmarchive.h b/lib/rpmarchive.h
index c864e5b56..2484b4d71 100644
--- a/lib/rpmarchive.h
+++ b/lib/rpmarchive.h
@@ -122,9 +122,9 @@ int rpmfiArchiveWriteFile(rpmfi fi, FD_t fd);
* @param fi file info
* @param buf pointer to buffer
* @param size number of bytes to read
- * @return bytes actually read
+ * @return bytes actually read, -1 on error
*/
-size_t rpmfiArchiveRead(rpmfi fi, void * buf, size_t size);
+ssize_t rpmfiArchiveRead(rpmfi fi, void * buf, size_t size);
/** \ingroup payload
* Has current file content stored in the archive
diff --git a/lib/rpmfi.c b/lib/rpmfi.c
index c314a8b29..af428468c 100644
--- a/lib/rpmfi.c
+++ b/lib/rpmfi.c
@@ -2261,7 +2261,7 @@ int rpmfiArchiveHasContent(rpmfi fi)
return res;
}
-size_t rpmfiArchiveRead(rpmfi fi, void * buf, size_t size)
+ssize_t rpmfiArchiveRead(rpmfi fi, void * buf, size_t size)
{
if (fi == NULL || fi->archive == NULL)
return -1;
--
2.27.0

View File

@ -1,30 +0,0 @@
From 61ea5a8ea64dc130713da889f3f0c8da1a547bd9 Mon Sep 17 00:00:00 2001
From: Ross Burton <ross.burton@intel.com>
Date: Wed, 4 Dec 2019 17:13:10 +0000
Subject: [PATCH] rpmio: initialise libgcrypt
If we're using libgcrypt for hashing we need to initialise libgcrypt as
otherwise it is not thread-safe. Without this it will crash when used
in parallel packaging runs.
Fixes #968
---
rpmio/digest_libgcrypt.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/rpmio/digest_libgcrypt.c b/rpmio/digest_libgcrypt.c
index b31fda569..291187f60 100644
--- a/rpmio/digest_libgcrypt.c
+++ b/rpmio/digest_libgcrypt.c
@@ -20,6 +20,8 @@ struct DIGEST_CTX_s {
/**************************** init ************************************/
int rpmInitCrypto(void) {
+ gcry_check_version (NULL);
+ gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
return 0;
}
--
2.27.0

View File

@ -1,25 +0,0 @@
From 733a0997ba5608f6b37d0b6d47c7bbd6f9d62381 Mon Sep 17 00:00:00 2001
From: openeuler-basic <shenyangyang4@huawei.com>
Date: Fri, 10 Jan 2020 10:29:16 +0800
Subject: [PATCH] bugfix rpm 4.14.2 fix tty failed
---
rpmpopt.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rpmpopt.in b/rpmpopt.in
index 8e4ef02..9585422 100644
--- a/rpmpopt.in
+++ b/rpmpopt.in
@@ -219,7 +219,7 @@ rpmbuild alias --buildpolicy --define '__os_install_post %{_rpmconfigdir}/brp-!#
--POPTargs=$"<policy>"
# Minimally preserve rpmbuild's --sign functionality
rpmbuild alias --sign \
- --pipe 'rpm --addsign `grep ".*: .*\.rpm$"|cut -d: -f2` < "/dev/"`ps -p $$ -o tty | tail -n 1`' \
+ --pipe "grep '.*: .*\.rpm$'|cut -d: -f2|xargs -r rpm --addsign" \
--POPTdesc=$"generate GPG signature (deprecated, use command rpmsign instead)"
rpmbuild alias --trace --eval '%trace' \
--POPTdesc=$"trace macro expansion"
--
1.8.3.1

View File

@ -1,46 +0,0 @@
From ab2179452c5be276a6b96c591afded485c7e58c3 Mon Sep 17 00:00:00 2001
From: Panu Matilainen <pmatilai@redhat.com>
Date: Wed, 13 Nov 2019 11:38:07 +0200
Subject: [PATCH] change rpmsigdig test's SHA256HEADER SHA1HEADER SIGMD5 value
---
tests/rpmsigdig.at | 6 +++---
tests/rpmtests | 6 +++---
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/tests/rpmsigdig.at b/tests/rpmsigdig.at
index 3c15221..91c205e 100644
--- a/tests/rpmsigdig.at
+++ b/tests/rpmsigdig.at
@@ -146,9 +146,9 @@ done
runroot rpmkeys -Kv /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
],
[0],
-[SHA256HEADER: 8d150309b6988914994ad609ff8267718f23e8034affe260e6d4361a83a45a62
-SHA1HEADER: 78606c9281c44f34470d26df2caebba117b9d183
-SIGMD5: 3269c96a8e88bf4514647c570c66723b
+[SHA256HEADER: 340fcc0e848922c0a0c5e9f988482683038b4c753d29ef4682a3ca279cef2ef4
+SHA1HEADER: 12352190a4557cd595387fbf0474ae65fd324158
+SIGMD5: 3dc56bbd5166fca1d2c7cb637a057049
PAYLOADDIGEST: 749d8980cc5889419da8cdbe9a5b3292742af8a227db3635f84966481b7612a8
/build/RPMS/noarch/attrtest-1.0-1.noarch.rpm:
Header SHA256 digest: OK
diff --git a/tests/rpmtests b/tests/rpmtests
index 6fa80e3..ae95856 100644
--- a/tests/rpmtests
+++ b/tests/rpmtests
@@ -14547,9 +14547,9 @@ runroot rpmkeys -Kv /build/RPMS/noarch/attrtest-1.0-1.noarch.rpm
at_status=$? at_failed=false
$at_check_filter
at_fn_diff_devnull "$at_stderr" || at_failed=:
-echo >>"$at_stdout"; $as_echo "SHA256HEADER: 8d150309b6988914994ad609ff8267718f23e8034affe260e6d4361a83a45a62
-SHA1HEADER: 78606c9281c44f34470d26df2caebba117b9d183
-SIGMD5: 3269c96a8e88bf4514647c570c66723b
+echo >>"$at_stdout"; $as_echo "SHA256HEADER: 340fcc0e848922c0a0c5e9f988482683038b4c753d29ef4682a3ca279cef2ef4
+SHA1HEADER: 12352190a4557cd595387fbf0474ae65fd324158
+SIGMD5: 3dc56bbd5166fca1d2c7cb637a057049
PAYLOADDIGEST: 749d8980cc5889419da8cdbe9a5b3292742af8a227db3635f84966481b7612a8
/build/RPMS/noarch/attrtest-1.0-1.noarch.rpm:
Header SHA256 digest: OK
--

View File

@ -1,30 +0,0 @@
From f2bc669cd0a080792522dd1bb7f50ef7025f16f0 Mon Sep 17 00:00:00 2001
From: Mark Wielaard <mark@klomp.org>
Date: Sat, 21 Jul 2018 10:13:04 +0200
Subject: [PATCH] find-debuginfo.sh: decompress DWARF compressed ELF sections
debugedit and dwz do not support DWARF compressed ELF sections, let's
just decompress those before extracting debuginfo.
Tested-by: Igor Gnatenko <i.gnatenko.brain@gmail.com>
---
scripts/find-debuginfo.sh | 3 +++
1 file changed, 3 insertions(+)
diff --git a/scripts/find-debuginfo.sh b/scripts/find-debuginfo.sh
index 90a44942d..7b01bc036 100755
--- a/scripts/find-debuginfo.sh
+++ b/scripts/find-debuginfo.sh
@@ -357,6 +357,9 @@ do_file()
get_debugfn "$f"
[ -f "${debugfn}" ] && return
+ echo "explicitly decompress any DWARF compressed ELF sections in $f"
+ eu-elfcompress -q -p -t none "$f"
+
echo "extracting debug info from $f"
# See also cpio SOURCEFILE copy. Directories must match up.
debug_base_name="$RPM_BUILD_DIR"
--
2.18.0

42
get-in-use-of-ndb.patch Normal file
View File

@ -0,0 +1,42 @@
From 8ba0780a26429bbb474e23112627ebbaeb9abfee Mon Sep 17 00:00:00 2001
From: renmingshuai <renmingshuai@huawei.com>
Date: Mon, 29 Nov 2021 10:53:24 +0800
Subject: [PATCH] get in use of ndb
---
configure.ac | 4 ++--
macros.in | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/configure.ac b/configure.ac
index 6b161dc..ab1c667 100644
--- a/configure.ac
+++ b/configure.ac
@@ -490,9 +490,9 @@ AM_CONDITIONAL([BDB_RO], [test "$enable_bdb_ro" = yes])
# Check for SQLITE support
AC_ARG_ENABLE([sqlite],
[AS_HELP_STRING([--enable-sqlite=@<:@yes/no/auto@:>@)],
- [build with sqlite rpm database format support (default=yes)])],
+ [build with sqlite rpm database format support (default=auto)])],
[enable_sqlite="$enableval"],
- [enable_sqlite=yes])
+ [enable_sqlite=auto])
AS_IF([test "x$enable_sqlite" != "xno"], [
PKG_CHECK_MODULES([SQLITE], [sqlite3 >= 3.22.0], [have_sqlite=yes], [have_sqlite=no])
diff --git a/macros.in b/macros.in
index 22f675c..3e81918 100644
--- a/macros.in
+++ b/macros.in
@@ -602,7 +602,7 @@ package or when debugging this package.\
# sqlite Sqlite database
# dummy dummy backend (no actual functionality)
#
-%_db_backend sqlite
+%_db_backend ndb
#==============================================================================
# ---- GPG/PGP/PGP5 signature macros.
--
1.8.3.1

Binary file not shown.

BIN
rpm-4.17.0.tar.bz2 Normal file

Binary file not shown.

135
rpm.spec
View File

@ -1,66 +1,33 @@
Name: rpm
Version: 4.15.1
Release: 30
Version: 4.17.0
Release: 1
Summary: RPM Package Manager
License: GPLv2+
URL: http://www.rpm.org/
Source0: http://ftp.rpm.org/releases/rpm-4.15.x/%{name}-%{version}.tar.bz2
Source0: http://ftp.rpm.org/releases/rpm-4.17.x/%{name}-%{version}.tar.bz2
Patch1: Unbundle-config-site-and-add-RPM-LD-FLAGS-macro.patch
Patch2: rpm-4.12.0-rpm2cpio-hack.patch
Patch3: find-debuginfo.sh-decompress-DWARF-compressed-ELF-se.patch
Patch4: skip-updating-the-preferences.patch
Patch5: add-dist-to-release-by-default.patch
Patch6: Silence-spurious-error-message-from-lsetfilecon-on-E.patch
Patch7: revert-always-execute-file-trigger-scriptlet-callbac.patch
Patch8: change-rpmsigdig-test-s-SHA256HEADER-SHA1HEADER-SIGM.patch
Patch3: add-dist-to-release-by-default.patch
Patch4: revert-always-execute-file-trigger-scriptlet-callbac.patch
Patch5: bugfix-rpm-4.11.3-add-aarch64_ilp32-arch.patch
Patch6: bugfix-rpm-4.14.2-wait-once-get-rpmlock-fail.patch
Patch7: Generate-digest-lists.patch
Patch8: Add-digest-list-plugin.patch
Patch9: Don-t-add-dist-to-release-if-it-is-already-there.patch
Patch10: Use-user.digest_list-to-avoid-duplicate-processing-o.patch
Patch11: call-process_digest_list-after-files-are-added.patch
Patch12: fix-lsetxattr-error-in-container.patch
Patch13: get-in-use-of-ndb.patch
Patch14: backport-Use-root-as-default-UID_0_USER-and-UID_0_GROUP.patch
Patch15: still-in-use-of-python-scripts-from-old-version.patch
Patch9: bugfix-rpm-4.11.3-add-aarch64_ilp32-arch.patch
Patch10: bugfix-rpm-4.14.2-fix-tty-failed.patch
Patch11: bugfix-rpm-4.14.2-wait-once-get-rpmlock-fail.patch
Patch12: Use-common-error-logic-regardless-of-setexecfilecon-.patch
Patch13: Generate-digest-lists.patch
Patch14: Add-digest-list-plugin.patch
Patch15: Don-t-add-dist-to-release-if-it-is-already-there.patch
Patch16: Use-user.digest_list-to-avoid-duplicate-processing-o.patch
Patch17: call-process_digest_list-after-files-are-added.patch
Patch18: backport-Fix-changelog-trimming-to-work-relative-to-newest-ex.patch
Patch19: backport-Fix-resource-leaks-on-zstd-open-error-paths.patch
Patch20: backport-rpmio-initialise-libgcrypt.patch
Patch21: backport-fix-zstd-magic.patch
Patch22: backport-Don-t-require-signature-header-to-be-in-single-conti.patch
Patch23: backport-ndb-only-clear-the-dbenv-in-the-rpmdb-if-the-last-re.patch
Patch24: backport-Fix-regression-on-v3-package-handling-on-database-re.patch
Patch25: backport-Fix-a-minor-memory-leak-on-suppressed-inhibition-loc.patch
Patch26: backport-Fix-POPT_ARG_STRING-memleaks-in-librpmbuild.patch
Patch27: backport-Fix-build-regression-in-commit-307872f71b357a3839fd0.patch
Patch28: backport-Fix-isUnorderedReq-for-multiple-qualifiers.patch
Patch29: backport-If-fork-fails-in-getOutputFrom-close-opened-unused-p.patch
Patch30: backport-Fix-pointer-dereference-before-testing-for-NULL-in-r.patch
Patch31: backport-Don-t-look-into-source-package-provides-in-depsolvin.patch
Patch32: backport-rpmfiArchiveRead-use-signed-return-value-to-handle-1.patch
Patch33: backport-Fix-bump-up-the-limit-of-signature-header-to-64MB.patch
Patch34: backport-Remove-compare-of-global-array-tagsByName-to-NULL.patch
Patch35: backport-Always-close-libelf-handle-1313.patch
Patch36: backport-Add-missing-terminator-to-copyTagsFromMainDebug-arra.patch
Patch37: backport-Fix-possible-read-beyond-buffer-in-rstrnlenhash.patch
Patch38: backport-Make-fdSeek-return-0-on-success-1-on-error.patch
Patch39: backport-Fix-logic-error-in-grabArgs.patch
Patch40: backport-Use-libelf-for-determining-file-colors.patch
Patch41: backport-CVE-2021-20271.patch
Patch42: backport-optimize-signature-header-merge-a-bit.patch
Patch43: CVE-2021-20266.patch
Patch44: backport-build-prioritize-large-packages.patch
Patch45: backport-Fix-data-race-in-packageBinaries-function.patch
Patch46: fix-lsetxattr-error-in-container.patch
BuildRequires: gcc autoconf automake libtool make gawk popt-devel openssl-devel readline-devel libdb-devel
BuildRequires: gcc autoconf automake libtool make gawk popt-devel openssl-devel readline-devel
BuildRequires: zlib-devel libzstd-devel xz-devel bzip2-devel libarchive-devel ima-evm-utils-devel
BuildRequires: dbus-devel fakechroot elfutils-devel elfutils-libelf-devel ima-evm-utils
BuildRequires: lua-devel libcap-devel libacl-devel libselinux-devel file-devel gettext-devel ncurses-devel
BuildRequires: system-rpm-config dwz gnupg2
Requires: coreutils popt curl zstd libcap crontabs logrotate libdb-utils
BuildRequires: system-rpm-config dwz gnupg2 debugedit
Requires: coreutils popt curl zstd libcap crontabs logrotate
Obsoletes: %{name}-build-libs %{name}-sign-libs %{name}-sign %{name}-cron
Provides: %{name}-build-libs %{name}-sign-libs %{name}-sign %{name}-cron
Obsoletes: %{name}-plugin-selinux %{name}-plugin-syslog %{name}-plugin-systemd-inhibit < 4.15.1-28 %{name}-plugin-ima %{name}-plugin-prioreset
@ -75,18 +42,18 @@ The RPM Package Manager (RPM) is a powerful package management system capability
-verifying integrity of packaged software and resulting software installation
%package libs
Summary: Shared library of rpm 4.15
Summary: Shared library of rpm 4.17
Requires: %{name} = %{version}-%{release}
%description libs
Shared library of rpm 4.15.
Shared library of rpm 4.17.
%package build
Summary: Scripts and executable programs used to build packages
Requires: %{name} = %{version}-%{release}
Requires: elfutils binutils findutils sed grep gawk diffutils file patch
Requires: tar unzip gzip bzip2 cpio xz zstd pkgconfig system-rpm-config
Requires: gdb-headless
Requires: gdb-headless debugedit
%description build
This package provides scripts and executable programs that used to
@ -132,8 +99,6 @@ Obsoletes: apidocs
%prep
%autosetup -n %{name}-%{version} -p1
sed -ie 's:^python test:python2 test:g' tests/rpmtests tests/local.at
%build
CPPFLAGS="$CPPFLAGS -DLUA_COMPAT_APIINTCASTS"
CFLAGS="$RPM_OPT_FLAGS -DLUA_COMPAT_APIINTCASTS"
@ -163,7 +128,13 @@ done;
--with-imaevm \
--enable-zstd \
--enable-python \
--with-crypto=openssl
--enable-bdb-ro \
--enable-ndb \
--enable-bdb=no \
--enable-sqlite=no \
--with-crypto=openssl \
--with-fapolicyd=no \
--with-fsverity=no
%make_build
@ -184,6 +155,9 @@ install -m 755 scripts/rpm.daily ${RPM_BUILD_ROOT}%{_sysconfdir}/cron.daily/rpm
mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d
install -m 644 scripts/rpm.log ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/rpm
install -m 755 build-aux/config.guess ${RPM_BUILD_ROOT}%{_rpmconfigdir}/
install -m 755 build-aux/config.sub ${RPM_BUILD_ROOT}%{_rpmconfigdir}/
mkdir -p ${RPM_BUILD_ROOT}/usr/lib/tmpfiles.d
echo "r /var/lib/rpm/__db.*" > ${RPM_BUILD_ROOT}/usr/lib/tmpfiles.d/rpm.conf
@ -191,18 +165,10 @@ mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/rpm
mkdir -p $RPM_BUILD_ROOT%{_rpmconfigdir}/macros.d
mkdir -p $RPM_BUILD_ROOT/var/lib/rpm
for dbi in \
Basenames Conflictname Dirnames Group Installtid Name Obsoletename \
Packages Providename Requirename Triggername Sha1header Sigmd5 \
__db.001 __db.002 __db.003 __db.004 __db.005 __db.006 __db.007 \
__db.008 __db.009
do
touch $RPM_BUILD_ROOT/var/lib/rpm/$dbi
done
./rpmdb --define "_db_backend ndb" --dbpath=$(pwd)/ndb/ --initdb
cp -va ndb/. $RPM_BUILD_ROOT/var/lib/rpm/
#./rpmdb --dbpath=$RPM_BUILD_ROOT/var/lib/rpm --initdb
for dbutil in dump load recover stat upgrade verify
for dbutil in recover stat upgrade verify
do
ln -s ../../bin/db_${dbutil} $RPM_BUILD_ROOT/usr/lib/rpm/rpmdb_${dbutil}
done
@ -214,6 +180,7 @@ find $RPM_BUILD_ROOT -name "*.la"|xargs rm -f
rm -f $RPM_BUILD_ROOT/%{_rpmconfigdir}/{perldeps.pl,perl.*,pythond*}
rm -f $RPM_BUILD_ROOT/%{_fileattrsdir}/{perl*,python*}
rm -f $RPM_BUILD_ROOT/%{_rpmconfigdir}/{tcl.req,osgideps.pl}
rm -f $RPM_BUILD_ROOT/%{_sysconfdir}/dbus-1/system.d/org.rpm.conf
%check
make check || (cat tests/rpmtests.log; exit 0)
@ -226,6 +193,17 @@ make check || (cat tests/rpmtests.log; exit 0)
%postun libs -p /sbin/ldconfig
%posttrans
{
set -e
dbpath=$(rpm -E %{_dbpath})
while [ -e ${dbpath}/Packages ]
do
date >> /var/log/rebuilddb.log 2>&1
rpm -vvv --rebuilddb >> /var/log/rebuilddb.log 2>&1
done
} &
%files -f %{name}.lang
%defattr(-,root,root)
%license COPYING
@ -235,7 +213,8 @@ make check || (cat tests/rpmtests.log; exit 0)
%config(noreplace) %{_sysconfdir}/logrotate.d/rpm
%dir %{_sysconfdir}/rpm
%dir /var/lib/rpm
%attr(0644, root, root) %verify(not md5 size mtime) %ghost %config(missingok,noreplace) /var/lib/rpm/*
%attr(0644, root, root) %ghost %config(missingok,noreplace) /var/lib/rpm/*
%attr(0644, root, root) %ghost /var/lib/rpm/.*.lock
%lang(fr) %{_mandir}/fr/man[18]/*.[18]*
%lang(ko) %{_mandir}/ko/man[18]/*.[18]*
%lang(ja) %{_mandir}/ja/man[18]/*.[18]*
@ -257,6 +236,8 @@ make check || (cat tests/rpmtests.log; exit 0)
%{_rpmconfigdir}/platform
%{_libdir}/rpm-plugins/
%exclude %{_libdir}/rpm-plugins/systemd_inhibit.so
%exclude %{_libdir}/rpm-plugins/fsverity.so
%exclude %{_libdir}/rpm-plugins/dbus_announce.so
%dir %{_rpmconfigdir}/fileattrs
%{_bindir}/rpm
%{_bindir}/rpm2archive
@ -278,9 +259,6 @@ make check || (cat tests/rpmtests.log; exit 0)
%{_rpmconfigdir}/brp-*
%{_rpmconfigdir}/check-*
%{_rpmconfigdir}/debugedit
%{_rpmconfigdir}/sepdebugcrcfix
%{_rpmconfigdir}/find-debuginfo.sh
%{_rpmconfigdir}/find-lang.sh
%{_rpmconfigdir}/*provides*
%{_rpmconfigdir}/*requires*
@ -309,13 +287,20 @@ make check || (cat tests/rpmtests.log; exit 0)
%files help
%defattr(-,root,root)
%doc doc/manual/[a-z]*
%doc doc/librpm/html/*
%doc docs/manual/[a-z]*
%doc docs/librpm/html/*
%{_mandir}/man8/rpm*.8*
%exclude %{_mandir}/man8/rpm-plugin-systemd-inhibit.8*
%exclude %{_mandir}/man8/rpm-plugin-dbus-announce.8*
%{_mandir}/man1/gendiff.1*
%changelog
* Mon Dec 27 2021 renhongxun<renhongxun@huawei.com> - 4.17.0-1
- Type:requirement
- ID:NA
- SUG:NA
- DESC:upgrade to 4.17.0
* Mon Sep 13 2021 zhangtianxing<zhangtianxing3@huawei.com> - 4.15.1-30
- Type:bugfix
- ID:NA

View File

@ -1,39 +0,0 @@
From 90e2b3a3b1a6d2b18c4421ed17a94aa5c56108a8 Mon Sep 17 00:00:00 2001
From: openEuler Buildteam <buildteam@openeuler.org>
Date: Thu, 13 Feb 2020 21:32:33 +0800
Subject: [PATCH] skip updating the preferences
---
tests/Makefile.am | 2 +-
tests/Makefile.in | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 10f095b..ab92353 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -167,7 +167,7 @@ populate_testing:
for prog in gzip cat patch tar sh ln chmod rm mkdir uname grep sed find file ionice mktemp nice cut sort diff touch install wc coreutils xargs; do p=`which $${prog}`; if [ "$${p}" != "" ]; then ln -s $${p} testing/$(bindir)/; fi; done
for d in /proc /sys /selinux /etc/selinux; do if [ -d $${d} ]; then ln -s $${d} testing/$${d}; fi; done
(cd testing/magic && file -C)
- HOME=$(abs_builddir)/testing gpg2 --import ${abs_srcdir}/data/keys/*.secret
+ HOME=$(abs_builddir)/testing gpg2 --import --batch ${abs_srcdir}/data/keys/*.secret
check_DATA = atconfig atlocal $(TESTSUITE)
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 16bcdd5..5603c54 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -695,7 +695,7 @@ populate_testing:
for prog in gzip cat patch tar sh ln chmod rm mkdir uname grep sed find file ionice mktemp nice cut sort diff touch install wc coreutils xargs; do p=`which $${prog}`; if [ "$${p}" != "" ]; then ln -s $${p} testing/$(bindir)/; fi; done
for d in /proc /sys /selinux /etc/selinux; do if [ -d $${d} ]; then ln -s $${d} testing/$${d}; fi; done
(cd testing/magic && file -C)
- HOME=$(abs_builddir)/testing gpg2 --import ${abs_srcdir}/data/keys/*.secret
+ HOME=$(abs_builddir)/testing gpg2 --import --batch ${abs_srcdir}/data/keys/*.secret
@HAVE_FAKECHROOT_TRUE@check-local: $(check_DATA) populate_testing
@HAVE_FAKECHROOT_TRUE@ $(SHELL) '$(TESTSUITE)' $(TESTSUITEFLAGS)
--
1.8.3.1

View File

@ -0,0 +1,210 @@
From 4ec83c32024a8faf0a66a4275acbcd15751ee303 Mon Sep 17 00:00:00 2001
From: renhongxun <renhongxun@huawei.com>
Date: Wed, 29 Dec 2021 16:37:45 +0800
Subject: [PATCH] still in use of python scripts from old version
---
platform.in | 3 ++
scripts/Makefile.am | 8 +--
scripts/brp-python-bytecompile | 112 +++++++++++++++++++++++++++++++++++++++++
scripts/brp-python-hardlink | 25 +++++++++
4 files changed, 144 insertions(+), 4 deletions(-)
create mode 100644 scripts/brp-python-bytecompile
create mode 100755 scripts/brp-python-hardlink
diff --git a/platform.in b/platform.in
index 71496b8..748186e 100644
--- a/platform.in
+++ b/platform.in
@@ -82,10 +82,13 @@
#
%__arch_install_post @ARCH_INSTALL_POST@
+%_python_bytecompile_errors_terminate_build 0
+%_python_bytecompile_extra 1
# Standard brp-macro naming:
# convert all '-' in basename to '_', add two leading underscores.
%__brp_compress %{_rpmconfigdir}/brp-compress %{?_prefix}
+%__brp_python_bytecompile %{_rpmconfigdir}/brp-python-bytecompile "" "%{?_python_bytecompile_errors_terminate_build}" "%{?_python_bytecompile_extra}"
%__brp_strip %{_rpmconfigdir}/brp-strip %{__strip}
%__brp_strip_comment_note %{_rpmconfigdir}/brp-strip-comment-note %{__strip} %{__objdump}
%__brp_strip_static_archive %{_rpmconfigdir}/brp-strip-static-archive %{__strip}
diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index 4aed76b..5a1c494 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -6,8 +6,8 @@ AM_CFLAGS = @RPMCFLAGS@
CLEANFILES =
EXTRA_DIST = \
- brp-compress \
- brp-strip brp-strip-comment-note \
+ brp-compress brp-python-bytecompile \
+ brp-strip brp-strip-comment-note brp-python-hardlink \
brp-strip-static-archive brp-elfperms \
brp-remove-la-files \
check-files check-prereqs \
@@ -23,8 +23,8 @@ EXTRA_DIST = \
fontconfig.prov script.req
rpmconfig_SCRIPTS = \
- brp-compress \
- brp-strip brp-strip-comment-note \
+ brp-compress brp-python-bytecompile \
+ brp-strip brp-strip-comment-note brp-python-hardlink \
brp-strip-static-archive brp-elfperms \
brp-remove-la-files \
check-files check-prereqs \
diff --git a/scripts/brp-python-bytecompile b/scripts/brp-python-bytecompile
new file mode 100644
index 0000000..d9c4832
--- /dev/null
+++ b/scripts/brp-python-bytecompile
@@ -0,0 +1,112 @@
+#!/bin/bash
+errors_terminate=$2
+extra=$3
+
+# If using normal root, avoid changing anything.
+if [ -z "$RPM_BUILD_ROOT" ] || [ "$RPM_BUILD_ROOT" = "/" ]; then
+ exit 0
+fi
+
+# Figure out how deep we need to descend. We could pick an insanely high
+# number and hope it's enough, but somewhere, somebody's sure to run into it.
+depth=`(find "$RPM_BUILD_ROOT" -type f -name "*.py" -print0 ; echo /) | \
+ xargs -0 -n 1 dirname | sed 's,[^/],,g' | sort -u | tail -n 1 | wc -c`
+if [ -z "$depth" ] || [ "$depth" -le "1" ]; then
+ exit 0
+fi
+
+function python_bytecompile()
+{
+ local options=$1
+ local python_binary=$2
+ local exclude=$3
+ local python_libdir=$4
+ local depth=$5
+ local real_libdir=$6
+
+cat << EOF | $python_binary $options
+import compileall, sys, os, re
+
+python_libdir = "$python_libdir"
+depth = $depth
+real_libdir = "$real_libdir"
+build_root = "$RPM_BUILD_ROOT"
+exclude = r"$exclude"
+
+class Filter:
+ def search(self, path):
+ ret = not os.path.realpath(path).startswith(build_root)
+ if exclude:
+ ret = ret or re.search(exclude, path)
+ return ret
+
+sys.exit(not compileall.compile_dir(python_libdir, depth, real_libdir, force=1, rx=Filter(), quiet=1))
+EOF
+}
+
+# .pyc/.pyo files embed a "magic" value, identifying the ABI version of Python
+# bytecode that they are for.
+#
+# The files below RPM_BUILD_ROOT could be targeting multiple versions of
+# python (e.g. a single build that emits several subpackages e.g. a
+# python26-foo subpackage, a python31-foo subpackage etc)
+#
+# Support this by assuming that below each /usr/lib/python$VERSION/, all
+# .pyc/.pyo files are to be compiled for /usr/bin/python$VERSION.
+#
+# For example, below /usr/lib/python2.6/, we're targeting /usr/bin/python2.6
+# and below /usr/lib/python3.1/, we're targeting /usr/bin/python3.1
+
+shopt -s nullglob
+for python_libdir in `find "$RPM_BUILD_ROOT" -type d|grep -E "/usr/lib(64)?/python[0-9]\.[0-9]$"`;
+do
+ python_binary=/usr/bin/$(basename $python_libdir)
+ real_libdir=${python_libdir/$RPM_BUILD_ROOT/}
+ echo "Bytecompiling .py files below $python_libdir using $python_binary"
+
+ # Generate normal (.pyc) byte-compiled files.
+ python_bytecompile "" "$python_binary" "" "$python_libdir" "$depth" "$real_libdir"
+ if [ $? -ne 0 ] && [ 0$errors_terminate -ne 0 ]; then
+ # One or more of the files had a syntax error
+ exit 1
+ fi
+
+ # Generate optimized (.pyo) byte-compiled files.
+ python_bytecompile "-O" "$python_binary" "" "$python_libdir" "$depth" "$real_libdir"
+ if [ $? -ne 0 ] && [ 0$errors_terminate -ne 0 ]; then
+ # One or more of the files had a syntax error
+ exit 1
+ fi
+done
+
+
+# Handle other locations in the filesystem using the default python implementation
+# if extra is set to 0, don't do this
+if [ 0$extra -eq 0 ]; then
+ exit 0
+fi
+
+# If we don't have a default python interpreter, we cannot proceed
+default_python=${1:-/usr/bin/python}
+if [ ! -x "$default_python" ]; then
+ exit 0
+fi
+
+# Figure out if there are files to be bytecompiled with the default_python at all
+# this prevents unnecessary default_python invocation
+find "$RPM_BUILD_ROOT" -type f -name "*.py" | grep -Ev "/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]|/usr/share/doc" || exit 0
+
+# Generate normal (.pyc) byte-compiled files.
+python_bytecompile "" $default_python "/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]|/usr/share/doc" "$RPM_BUILD_ROOT" "$depth" "/"
+if [ $? -ne 0 ] && [ 0$errors_terminate -ne 0 ]; then
+ # One or more of the files had a syntax error
+ exit 1
+fi
+
+# Generate optimized (.pyo) byte-compiled files.
+python_bytecompile "-O" $default_python "/bin/|/sbin/|/usr/lib(64)?/python[0-9]\.[0-9]|/usr/share/doc" "$RPM_BUILD_ROOT" "$depth" "/"
+if [ $? -ne 0 ] && [ 0$errors_terminate -ne 0 ]; then
+ # One or more of the files had a syntax error
+ exit 1
+fi
+exit 0
diff --git a/scripts/brp-python-hardlink b/scripts/brp-python-hardlink
new file mode 100755
index 0000000..5fd1b43
--- /dev/null
+++ b/scripts/brp-python-hardlink
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+# If using normal root, avoid changing anything.
+if [ -z "$RPM_BUILD_ROOT" ] || [ "$RPM_BUILD_ROOT" = "/" ]; then
+ exit 0
+fi
+
+hardlink_if_same() {
+ if cmp -s "$1" "$2" ; then
+ ln -f "$1" "$2"
+ return 0
+ fi
+ return 1
+}
+
+# Hardlink identical *.pyc, *.pyo, and *.opt-[12].pyc.
+# Originally from PLD's rpm-build-macros
+find "$RPM_BUILD_ROOT" -type f -name "*.pyc" -not -name "*.opt-[12].pyc" | while read pyc ; do
+ hardlink_if_same "$pyc" "${pyc%c}o"
+ o1pyc="${pyc%pyc}opt-1.pyc"
+ hardlink_if_same "$pyc" "$o1pyc"
+ o2pyc="${pyc%pyc}opt-2.pyc"
+ hardlink_if_same "$pyc" "$o2pyc" || hardlink_if_same "$o1pyc" "$o2pyc"
+done
+exit 0
--
1.8.3.1