diff options
author | Mark Wielaard <mark@klomp.org> | 2017-03-15 20:07:29 +0100 |
---|---|---|
committer | Panu Matilainen <pmatilai@redhat.com> | 2017-03-21 14:25:39 +0200 |
commit | b91dc6106e360f13ff365dfac247191942039152 (patch) | |
tree | 3b99a7369e076044998868770f5a2b501fc838eb | |
parent | dc759bc655ff1c18a08d77dd31dedfe3ae1025b0 (diff) | |
download | rpm-b91dc6106e360f13ff365dfac247191942039152.tar.gz |
Make sure to reset file attributes for generated build-id directories.
[Note this patch is currently being tested in Fedora. See bug below.]
When creating the build-id directories we should reset the file attributes
to the defaults. Otherwise if the file list contained an %attr or %defattr
the directories would come out with the wrong mode.
Includes a testcase based on a spec by Igor Gnatenko that fails before
and Check that build-id directories are created with the right permissions
even if the spec file sets attrs explicitly.
https://bugzilla.redhat.com/show_bug.cgi?id=1432372
Signed-off-by: Mark Wielaard <mark@klomp.org>
-rw-r--r-- | build/files.c | 21 | ||||
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/data/SOURCES/hello.c | 8 | ||||
-rw-r--r-- | tests/data/SPECS/hello-attr-buildid.spec | 27 | ||||
-rw-r--r-- | tests/rpmbuildid.at | 36 |
5 files changed, 94 insertions, 0 deletions
diff --git a/build/files.c b/build/files.c index ef5f80fc8..cca14b976 100644 --- a/build/files.c +++ b/build/files.c @@ -1806,6 +1806,7 @@ static int generateBuildIDs(FileList fl) char *mainiddir = NULL; char *debugiddir = NULL; if (rc == 0) { + char *attrstr; /* Add .build-id directories to hold the subdirs/symlinks. */ #define BUILD_ID_DIR "/usr/lib/.build-id" #define DEBUG_ID_DIR "/usr/lib/debug/.build-id" @@ -1813,6 +1814,18 @@ static int generateBuildIDs(FileList fl) mainiddir = rpmGetPath(fl->buildRoot, BUILD_ID_DIR, NULL); debugiddir = rpmGetPath(fl->buildRoot, DEBUG_ID_DIR, NULL); + /* Make sure to reset all file flags to defaults. + Uses parseForAttr to reset ar, arFlags, and specdFlags. + Note that parseForAttr pokes at the attrstr, so we cannot + just pass a static string. */ + fl->def.verifyFlags = RPMVERIFY_ALL; + fl->cur.verifyFlags = RPMVERIFY_ALL; + fl->def.specdFlags |= SPECD_VERIFY; + fl->cur.specdFlags |= SPECD_VERIFY; + attrstr = xstrdup ("%defattr(-,root,root)"); + parseForAttr(fl->pool, attrstr, 1, &fl->def); + free (attrstr); + /* Supported, but questionable. */ if (needMain && needDbg) rpmlog(RPMLOG_WARNING, @@ -1822,8 +1835,12 @@ static int generateBuildIDs(FileList fl) if ((rc = rpmioMkpath(mainiddir, 0755, -1, -1)) != 0) { rpmlog(RPMLOG_ERR, "%s %s: %m\n", errdir, mainiddir); } else { + rasprintf (&attrstr, "%s %s", "%attr(-,root,root) ", + mainiddir); + parseForAttr(fl->pool, attrstr, 0, &fl->cur); fl->cur.isDir = 1; rc = addFile(fl, mainiddir, NULL); + free (attrstr); } } @@ -1831,8 +1848,12 @@ static int generateBuildIDs(FileList fl) if ((rc = rpmioMkpath(debugiddir, 0755, -1, -1)) != 0) { rpmlog(RPMLOG_ERR, "%s %s: %m\n", errdir, debugiddir); } else { + rasprintf (&attrstr, "%s %s", "%attr(-,root,root) ", + debugiddir); + parseForAttr(fl->pool, attrstr, 0, &fl->cur); fl->cur.isDir = 1; rc = addFile(fl, debugiddir, NULL); + free (attrstr); } } } diff --git a/tests/Makefile.am b/tests/Makefile.am index 815a3909e..ad41957d0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -69,6 +69,8 @@ EXTRA_DIST += data/RPMS/hello-2.0-1.i686.rpm EXTRA_DIST += data/RPMS/hello-2.0-1.x86_64.rpm EXTRA_DIST += data/SRPMS/foo-1.0-1.src.rpm EXTRA_DIST += data/SRPMS/hello-1.0-1.src.rpm +EXTRA_DIST += data/SOURCES/hello.c +EXTRA_DIST += data/SPECS/hello-attr-buildid.spec # testsuite voodoo AUTOTEST = $(AUTOM4TE) --language=autotest diff --git a/tests/data/SOURCES/hello.c b/tests/data/SOURCES/hello.c new file mode 100644 index 000000000..020484eed --- /dev/null +++ b/tests/data/SOURCES/hello.c @@ -0,0 +1,8 @@ +#include <stdio.h> + +int +main (void) +{ + printf ("Hello, world!\n"); + return 0; +} diff --git a/tests/data/SPECS/hello-attr-buildid.spec b/tests/data/SPECS/hello-attr-buildid.spec new file mode 100644 index 000000000..cdab95fff --- /dev/null +++ b/tests/data/SPECS/hello-attr-buildid.spec @@ -0,0 +1,27 @@ +Name: test +Version: 1.0 +Release: 1 +Summary: Test + +License: Public Domain +URL: https://fedoraproject.org +Source: hello.c + +%description +%{summary}. + +%prep +%autosetup -c -D -T +cp -a %{S:0} . + +%build +gcc -g hello.c -o hello + +%install +mkdir -p %{buildroot}%{_bindir} +install -D -p -m 0755 -t %{buildroot}%{_bindir} hello + +%files +%attr(644,root,root) %{_bindir}/hello + +%changelog diff --git a/tests/rpmbuildid.at b/tests/rpmbuildid.at index 15c06202f..1cae26dbf 100644 --- a/tests/rpmbuildid.at +++ b/tests/rpmbuildid.at @@ -1166,3 +1166,39 @@ if test "$id1" == "$id2"; then echo "equal"; else echo "unequal $id1 $id2"; fi ], [ignore]) AT_CLEANUP + +# ------------------------------ +# Check that build-id directories are created with the right permissions +# even if the spec file sets attrs explicitly. +AT_SETUP([rpmbuild buildid attrs]) +AT_KEYWORDS([build] [debuginfo] [buildid]) +AT_CHECK([ +rm -rf ${TOPDIR} +AS_MKDIR_P(${TOPDIR}/SOURCES) + +# Setup sources +cp "${abs_srcdir}"/data/SOURCES/hello.c ${TOPDIR}/SOURCES + +# Build, contains one ELF which should have a buildid. +run rpmbuild \ + --macros=${abs_top_builddir}/macros:${abs_top_builddir}/tests/testing/usr/local/lib/rpm/platform/%{_target_cpu}-%{_target_os}/macros:${top_srcdir}/macros.debug \ + --rcfile=${abs_top_builddir}/rpmrc \ + --define="_build_id_links compat" \ + --define "_unique_debug_names 1" \ + --define "_unique_debug_srcs 1" \ + --quiet -ba "${abs_srcdir}"/data/SPECS/hello-attr-buildid.spec + +run rpm -qp --qf "[[%{filenames} %{filemodes:perms}\n]]" \ + ${abs_builddir}/testing/build/RPMS/*/test-1.0-1*rpm \ + | grep "build-id d" + +run rpm -qp --qf "[[%{filenames} %{filemodes:perms}\n]]" \ + ${abs_builddir}/testing/build/RPMS/*/test-debuginfo-1.0-1*rpm \ + | grep "build-id d" +], +[0], +[/usr/lib/.build-id drwxr-xr-x +/usr/lib/debug/.build-id drwxr-xr-x +], +[ignore]) +AT_CLEANUP |