Proper fix for comments affecting macro file parsing (#1953910)

This commit is contained in:
Panu Matilainen 2021-04-29 14:35:08 +03:00
parent e38cfd281b
commit 77dba0a29f
3 changed files with 97 additions and 77 deletions

View File

@ -0,0 +1,92 @@
From 847c6f062c267c4be643be9c202141bd330a7891 Mon Sep 17 00:00:00 2001
Message-Id: <847c6f062c267c4be643be9c202141bd330a7891.1619695949.git.pmatilai@redhat.com>
From: Panu Matilainen <pmatilai@redhat.com>
Date: Wed, 28 Apr 2021 10:20:55 +0300
Subject: [PATCH] Ignore comment line contents in macro files (#1659)
Previously %{ and similar in macro file comment line would cause the
line continuation logic to trigger and silently eat macro definitions
up to the next empty line. Since 75275a87cff04da65d3557f2c40ea2b526528c4c
we permit empty lines inside macro definitions, which would cause the
whole remaining file to be silently skipped (RhBug:1953910)
Only ever parse macro file lines starting with %, and add a test for
the case.
Actual patch by Michael Schroeder, testcase by undersigned.
Fixes: #1659
---
rpmio/macro.c | 8 ++++++++
tests/data/macros.testfile | 7 +++++++
tests/rpmmacro.at | 17 +++++++++++++++++
3 files changed, 32 insertions(+)
diff --git a/rpmio/macro.c b/rpmio/macro.c
index 6dfc73336..94ff5187d 100644
--- a/rpmio/macro.c
+++ b/rpmio/macro.c
@@ -226,6 +226,14 @@ rdcl(char * buf, size_t size, FILE *f)
nb--;
if (*q == 0)
break; /* no newline found, EOF */
+ if (p == buf) {
+ while (*p && isblank(*p))
+ p++;
+ if (*p != '%') { /* only parse actual macro */
+ *q = '\0'; /* trim trailing \r, \n */
+ break;
+ }
+ }
for (; p < q; p++) {
switch (*p) {
case '\\':
diff --git a/tests/data/macros.testfile b/tests/data/macros.testfile
index 86fd883fc..f56c80578 100644
--- a/tests/data/macros.testfile
+++ b/tests/data/macros.testfile
@@ -5,6 +5,13 @@
}
%second %{?def:macro_2}
+# empty lines inside a %{ block
+%empty0 %{expand:
+some
+
+thing
+}
+
%comment1 %{expand:
read
%dnl comment
diff --git a/tests/rpmmacro.at b/tests/rpmmacro.at
index 072b986be..c0f114087 100644
--- a/tests/rpmmacro.at
+++ b/tests/rpmmacro.at
@@ -945,6 +945,23 @@ read
[])
AT_CLEANUP
+AT_SETUP([macro file empty lines])
+AT_KEYWORDS([macros])
+AT_CHECK([
+runroot rpm \
+ --macros /data/macros.testfile \
+ --eval "%{empty0}"
+],
+[0],
+[
+some
+
+thing
+
+],
+[])
+AT_CLEANUP
+
AT_SETUP([macro traceback])
AT_KEYWORDS([macros])
AT_CHECK([
--
2.30.2

View File

@ -1,74 +0,0 @@
From eb8aee3f45024fa1e631ac2da5b06f5a9abf16d3 Mon Sep 17 00:00:00 2001
Message-Id: <eb8aee3f45024fa1e631ac2da5b06f5a9abf16d3.1619509954.git.pmatilai@redhat.com>
From: Panu Matilainen <pmatilai@redhat.com>
Date: Tue, 27 Apr 2021 10:51:14 +0300
Subject: [PATCH] Revert "Fix logic error in macro file reader"
This trips over the following comment line in macros.python-srpm,
preventing all subsequent macros from loading:
Temporarily revert to let Python builds continue while looking for
proper fix.
This reverts commit 75275a87cff04da65d3557f2c40ea2b526528c4c.
---
rpmio/macro.c | 20 ++++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/rpmio/macro.c b/rpmio/macro.c
index 6dfc73336..f2a2335df 100644
--- a/rpmio/macro.c
+++ b/rpmio/macro.c
@@ -209,24 +209,24 @@ findEntry(rpmMacroContext mc, const char *name, size_t namelen, size_t *pos)
static int
rdcl(char * buf, size_t size, FILE *f)
{
+ char *q = buf - 1; /* initialize just before buffer. */
size_t nb = 0;
+ size_t nread = 0;
int pc = 0, bc = 0, xc = 0;
int nlines = 0;
char *p = buf;
- char *q = buf;
if (f != NULL)
do {
- *q = '\0'; /* terminate */
+ *(++q) = '\0'; /* terminate and move forward. */
if (fgets(q, size, f) == NULL) /* read next line. */
break;
nlines++;
nb = strlen(q);
- for (q += nb; nb > 0 && iseol(q[-1]); q--)
+ nread += nb; /* trim trailing \r and \n */
+ for (q += nb - 1; nb > 0 && iseol(*q); q--)
nb--;
- if (*q == 0)
- break; /* no newline found, EOF */
- for (; p < q; p++) {
+ for (; p <= q; p++) {
switch (*p) {
case '\\':
switch (*(p+1)) {
@@ -250,14 +250,14 @@ rdcl(char * buf, size_t size, FILE *f)
case ']': if (xc > 0) xc--; break;
}
}
- if ((nb == 0 || q[-1] != '\\') && !bc && !pc && !xc) {
- *q = '\0'; /* trim trailing \r, \n */
+ if (nb == 0 || (*q != '\\' && !bc && !pc && !xc) || *(q+1) == '\0') {
+ *(++q) = '\0'; /* trim trailing \r, \n */
break;
}
q++; nb++; /* copy newline too */
size -= nb;
- if (q[-1] == '\r') /* XXX avoid \r madness */
- q[-1] = '\n';
+ if (*q == '\r') /* XXX avoid \r madness */
+ *q = '\n';
} while (size > 0);
return nlines;
}
--
2.30.2

View File

@ -32,7 +32,7 @@
%global rpmver 4.16.90 %global rpmver 4.16.90
%global snapver git15395 %global snapver git15395
%global rel 4 %global rel 5
%global sover 9 %global sover 9
%global srcver %{rpmver}%{?snapver:-%{snapver}} %global srcver %{rpmver}%{?snapver:-%{snapver}}
@ -54,8 +54,7 @@ Patch3: rpm-4.9.90-no-man-dirs.patch
# https://github.com/rpm-software-management/rpm/pull/473 # https://github.com/rpm-software-management/rpm/pull/473
Patch6: 0001-find-debuginfo.sh-decompress-DWARF-compressed-ELF-se.patch Patch6: 0001-find-debuginfo.sh-decompress-DWARF-compressed-ELF-se.patch
# Temporarily for https://bugzilla.redhat.com/show_bug.cgi?id=1953910 Patch10: 0001-Ignore-comment-line-contents-in-macro-files-1659.patch
Patch10: 0001-Revert-Fix-logic-error-in-macro-file-reader.patch
# Patches already upstream: # Patches already upstream:
@ -572,6 +571,9 @@ fi
%doc doc/librpm/html/* %doc doc/librpm/html/*
%changelog %changelog
* Thu Apr 29 2021 Panu Matilainen <pmatilai@redhat.com> - 4.16.90-0.git15395.5
- Proper fix for comments affecting macro file parsing (#1953910)
* Tue Apr 27 2021 Panu Matilainen <pmatilai@redhat.com> - 4.16.90-0.git15395.4 * Tue Apr 27 2021 Panu Matilainen <pmatilai@redhat.com> - 4.16.90-0.git15395.4
- Enable fapolicyd plugin build - Enable fapolicyd plugin build