From cdd9fc41a9a76c363d7c4e2ff386cb420e518922212437dbe60610894387f9f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Fri, 3 May 2024 19:29:47 +0200 Subject: [PATCH] Sync from SUSE:SLFO:Main pmix revision d5036494583eb8b84f8a175e4ede36da --- .gitattributes | 23 ++ ...h-allows-chown-on-user-created-links.patch | 139 ++++++++++++ openpmix-3.2.3.tar.gz | 3 + pmix.changes | 170 ++++++++++++++ pmix.spec | 211 ++++++++++++++++++ 5 files changed, 546 insertions(+) create mode 100644 .gitattributes create mode 100644 Fix-a-potential-vulnerability-which-allows-chown-on-user-created-links.patch create mode 100644 openpmix-3.2.3.tar.gz create mode 100644 pmix.changes create mode 100644 pmix.spec diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/Fix-a-potential-vulnerability-which-allows-chown-on-user-created-links.patch b/Fix-a-potential-vulnerability-which-allows-chown-on-user-created-links.patch new file mode 100644 index 0000000..685571f --- /dev/null +++ b/Fix-a-potential-vulnerability-which-allows-chown-on-user-created-links.patch @@ -0,0 +1,139 @@ +From: Egbert Eich +Date: Tue Sep 12 15:51:49 2023 +0200 +Subject: Fix a potential vulnerability which allows chown on user-created links +Patch-mainline: ae62cdf67b19e80fd821420816f09bf0a56a8166 +Git-commit: 6364ce66b4ac487b684d512089eeb0c3d577ba98 +References: bsc#1215190 + +This fixes CVE-2023-41915, bsc#1215190. +This is a backport of: + Do not follow links when doing "chown" + + There is a potential issue with allowing a "chown" operation + to follow user-created links, so let's limit any use of that + function to "lchown" - which directs the "chown" operation to + NOT follow a link. + + Signed-off-by: Ralph Castain +Signed-off-by: Egbert Eich +Signed-off-by: Egbert Eich +--- + src/mca/common/dstore/dstore_base.c | 4 ++-- + src/mca/common/dstore/dstore_segment.c | 4 ++-- + src/mca/gds/ds12/gds_ds12_lock_fcntl.c | 2 +- + src/mca/gds/ds12/gds_ds12_lock_pthread.c | 2 +- + src/mca/ptl/usock/ptl_usock_component.c | 4 ++-- + src/util/pmix_pty.c | 3 ++- + 6 files changed, 10 insertions(+), 9 deletions(-) +diff --git a/src/mca/common/dstore/dstore_base.c b/src/mca/common/dstore/dstore_base.c +index f22461c..7ff2e4d 100644 +--- a/src/mca/common/dstore/dstore_base.c ++++ b/src/mca/common/dstore/dstore_base.c +@@ -528,7 +528,7 @@ static int _esh_session_init(pmix_common_dstore_ctx_t *ds_ctx, size_t idx, ns_ma + } + } + if (s->setjobuid > 0){ +- if (0 > chown(s->nspace_path, (uid_t) s->jobuid, (gid_t) -1)){ ++ if (0 > lchown(s->nspace_path, (uid_t) s->jobuid, (gid_t) -1)){ + rc = PMIX_ERROR; + PMIX_ERROR_LOG(rc); + return rc; +@@ -1682,7 +1682,7 @@ pmix_common_dstore_ctx_t *pmix_common_dstor_init(const char *ds_name, pmix_info_ + } + } + if (ds_ctx->setjobuid > 0) { +- if (chown(ds_ctx->base_path, (uid_t) ds_ctx->jobuid, (gid_t) -1) < 0){ ++ if (lchown(ds_ctx->base_path, (uid_t) ds_ctx->jobuid, (gid_t) -1) < 0){ + rc = PMIX_ERR_NO_PERMISSIONS; + PMIX_ERROR_LOG(rc); + goto err_exit; +diff --git a/src/mca/common/dstore/dstore_segment.c b/src/mca/common/dstore/dstore_segment.c +index f0c4f9b..0e68dbf 100644 +--- a/src/mca/common/dstore/dstore_segment.c ++++ b/src/mca/common/dstore/dstore_segment.c +@@ -120,7 +120,7 @@ PMIX_EXPORT pmix_dstore_seg_desc_t *pmix_common_dstor_create_new_lock_seg(const + + if (setuid > 0){ + rc = PMIX_ERR_PERM; +- if (0 > chown(file_name, (uid_t) uid, (gid_t) -1)){ ++ if (0 > lchown(file_name, (uid_t) uid, (gid_t) -1)){ + PMIX_ERROR_LOG(rc); + goto err_exit; + } +@@ -211,7 +211,7 @@ PMIX_EXPORT pmix_dstore_seg_desc_t *pmix_common_dstor_create_new_segment(pmix_ds + + if (setuid > 0){ + rc = PMIX_ERR_PERM; +- if (0 > chown(file_name, (uid_t) uid, (gid_t) -1)){ ++ if (0 > lchown(file_name, (uid_t) uid, (gid_t) -1)){ + PMIX_ERROR_LOG(rc); + goto err_exit; + } +diff --git a/src/mca/gds/ds12/gds_ds12_lock_fcntl.c b/src/mca/gds/ds12/gds_ds12_lock_fcntl.c +index 4452316..82b6d35 100644 +--- a/src/mca/gds/ds12/gds_ds12_lock_fcntl.c ++++ b/src/mca/gds/ds12/gds_ds12_lock_fcntl.c +@@ -127,7 +127,7 @@ pmix_status_t pmix_gds_ds12_lock_init(pmix_common_dstor_lock_ctx_t *ctx, const c + } + } + if (0 != setuid) { +- if (0 > chown(lock_ctx->lockfile, uid, (gid_t) -1)) { ++ if (0 > lchown(lock_ctx->lockfile, uid, (gid_t) -1)) { + rc = PMIX_ERROR; + PMIX_ERROR_LOG(rc); + goto error; +diff --git a/src/mca/gds/ds12/gds_ds12_lock_pthread.c b/src/mca/gds/ds12/gds_ds12_lock_pthread.c +index 8192f05..57d855f 100644 +--- a/src/mca/gds/ds12/gds_ds12_lock_pthread.c ++++ b/src/mca/gds/ds12/gds_ds12_lock_pthread.c +@@ -113,7 +113,7 @@ pmix_status_t pmix_gds_ds12_lock_init(pmix_common_dstor_lock_ctx_t *ctx, const c + } + memset(lock_ctx->segment->seg_base_addr, 0, size); + if (0 != setuid) { +- if (0 > chown(lock_ctx->lockfile, (uid_t) uid, (gid_t) -1)){ ++ if (0 > lchown(lock_ctx->lockfile, (uid_t) uid, (gid_t) -1)){ + rc = PMIX_ERROR; + PMIX_ERROR_LOG(rc); + goto error; +diff --git a/src/mca/ptl/usock/ptl_usock_component.c b/src/mca/ptl/usock/ptl_usock_component.c +index 3120302..ff2542d 100644 +--- a/src/mca/ptl/usock/ptl_usock_component.c ++++ b/src/mca/ptl/usock/ptl_usock_component.c +@@ -267,14 +267,14 @@ static pmix_status_t setup_listener(pmix_info_t info[], size_t ninfo, + } + /* chown as required */ + if (lt->owner_given) { +- if (0 != chown(address->sun_path, lt->owner, -1)) { ++ if (0 != lchown(address->sun_path, lt->owner, -1)) { + pmix_output(0, "CANNOT CHOWN socket %s: %s", address->sun_path, strerror (errno)); + CLOSE_THE_SOCKET(lt->socket); + goto sockerror; + } + } + if (lt->group_given) { +- if (0 != chown(address->sun_path, -1, lt->group)) { ++ if (0 != lchown(address->sun_path, -1, lt->group)) { + pmix_output(0, "CANNOT CHOWN socket %s: %s", address->sun_path, strerror (errno)); + CLOSE_THE_SOCKET(lt->socket); + goto sockerror; +diff --git a/src/util/pmix_pty.c b/src/util/pmix_pty.c +index 58e8d51..a5e3c0c 100644 +--- a/src/util/pmix_pty.c ++++ b/src/util/pmix_pty.c +@@ -11,6 +11,7 @@ + * All rights reserved. + * Copyright (c) 2018 Cisco Systems, Inc. All rights reserved + * Copyright (c) 2019-2020 Intel, Inc. All rights reserved. ++ * Copyright (c) 2021-2023 Nanook Consulting. All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow +@@ -248,7 +249,7 @@ static int ptys_open(int fdm, char *pts_name) + gid = -1; /* group tty is not in the group file */ + } + /* following two functions don't work unless we're root */ +- chown(pts_name, getuid(), gid); ++ lchown(pts_name, getuid(), gid); // DO NOT FOLLOW LINKS + chmod(pts_name, S_IRUSR | S_IWUSR | S_IWGRP); + fds = open(pts_name, O_RDWR); + if (fds < 0) { diff --git a/openpmix-3.2.3.tar.gz b/openpmix-3.2.3.tar.gz new file mode 100644 index 0000000..01b3247 --- /dev/null +++ b/openpmix-3.2.3.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2995281f07e1944c4cf23fe4bf1b2c0b3d28e82ac4fcd07d3bb06e1115d5429d +size 1069474 diff --git a/pmix.changes b/pmix.changes new file mode 100644 index 0000000..50656af --- /dev/null +++ b/pmix.changes @@ -0,0 +1,170 @@ +------------------------------------------------------------------- +Tue Sep 12 14:04:10 UTC 2023 - Egbert Eich + +- Fix a potential vulnerability where a `chown` may follow a + user-created link: + Fix-a-potential-vulnerability-which-allows-chown-on-user-created-links.patch + (CVE-2023-41915, bsc#1215190). + +------------------------------------------------------------------- +Tue Mar 21 15:27:23 UTC 2023 - Egbert Eich + +- Move the requirement for pmix-runtime-config to libpmix2 and make + it version-independent (bsc#1209473). +- Install pmix-plugin-munge if munge is installed. +- Use correct prerequisite name: pmix-plugin-munge not pmix-plugins-munge + +------------------------------------------------------------------- +Mon Mar 20 13:44:26 UTC 2023 - Dominique Leuenberger + +- The devel package must require the actual library libpmix2. + +------------------------------------------------------------------- +Fri Mar 17 10:46:51 UTC 2023 - Christian Goll + +- removed library plugin for slurm as a fix was applied there, + (bsc#1209260) + +------------------------------------------------------------------- +Tue Mar 14 19:24:25 UTC 2023 - Egbert Eich + +- Create library plugin for Slurm: it contains the libpmix.so + link which normally goes into the devel package - without + the headers (bsc#1209260). + +------------------------------------------------------------------- +Mon Jul 11 14:57:37 UTC 2022 - Egbert Eich + +- Separate out psec munge plugin to avoid dependency creep. + +------------------------------------------------------------------- +Wed Jul 6 08:48:43 UTC 2022 - Nicolas Morey-Chaisemartin + +- Enable build on i686 and armv7 +- Move test files to %{_libexecdir}/pmix/tests to avoid conflicts + on 32 bits systems + +------------------------------------------------------------------- +Sat Jul 2 10:48:30 UTC 2022 - Egbert Eich + +- Provide Pmix tests in a test package to give users the + opportunity to test their setup. This is particularly + useful for Slurm. + +------------------------------------------------------------------- +Thu Feb 18 08:24:53 UTC 2021 - Egbert Eich + +- Remove BuildRequires: for pandoc: + Not needed and not available for SLE. + +------------------------------------------------------------------- +Tue Feb 16 15:44:56 UTC 2021 - Christian Goll + +- updated to v3.2.3 + * Fix thread conflict in event notification - PR #1967 + * Finalize: set hostname in global to NULL to avoid segfault + in apps that call init/finalize multiple times - PR #2001 + * Silence unnecessary error log message - PR #1669 + * Fixed crash of dstore locks destructor - PR #1776 + * Add option to bypass local-only fence optimization - PR #1825 + * Increase timeout in test case - PR #1830 + * Fix server/get for gds=hash - PR #1990 + * Remove stale config command - PR #1933 + * Modex size reductions - PR #1402/#1403/#1421/#1423 + * Sync 3.2 branch with master - PR #1832 + New attributes: + PMIX_HOSTNAME_ALIASES + PMIX_HOSTNAME_KEEP_FQDN + PMIX_GET_REFRESH_CACHE + PMIX_REQUIRED_KEY + Removed PMIX_VALUE_COMPRESSED_STRING_UNPACK macro from pmix_common.h + New frameworks + pcompress - Compression methods - PR #1139 + psquash - Flexible integer packing - PR #1423 + New components + preg/compress - regular expression methods - PR #1139 + Modified string representations produced by PMIx_generate_regex + and PMIx_generate_ppn. - PR #1422 + Fixed dmodex support and PMIx_Get behavior - Issue #1586 + Removed --with-pmix-symbol-rename configure option - PR #1748 + * Expose PMIX_REGEX constant per v3.2 standard - PR #1848 + * Fix immediate flag behavior at the server - PR #1885 + For futher details, check + - For Issues: https://github.com/openpmix/openpmix/issues/ + - For PRs: https://github.com/openpmix/openpmix/pull/ + +------------------------------------------------------------------- +Fri Apr 10 11:00:28 UTC 2020 - Egbert Eich + +- Mark header and config packages 'noarch' (boo#1170259). +- Add a bit of QA: include a %check stage. + +------------------------------------------------------------------- +Wed Apr 8 12:35:30 UTC 2020 - Egbert Eich + +- Create separate plugins package. Since libpmix2 obtains its + functionality from these plugins, add a dependency. +- Plugins depend on libmca_common_dstore - add an explicit + dependency to the package as there are other providers - like + openmpi3 (bsc#1167983). + +------------------------------------------------------------------- +Wed Mar 25 08:26:24 UTC 2020 - Bernhard Wiedemann + +- Update to version 3.1.5 (bsc#1167655) + * PR #1413/#1465: Remove unnecessary error log + * PR #1433: Return the correct status from PMIx_Publish + * PR #1445: Sync. with master to fix 'get' of data for unknown namespace + * Includes the following PRs from master + * PR #1382: dstore: fixed truncate key-names while restoring + * PR #1405: Fix xnspace dmodex and add verbose debug + * PR #1406: Resolve request for job-level data + * PR #1407/#1409/#1411: Fix dmodex across nspaces + * PR #1434/#1436: Cleanup handling of info arrays + * PR #1435: Cleanup example and remove debug + * PR #1437: Update blocking Allocation_request signature + * PR #1440: Fix 'get' of data for unknown namespace + * PR #1442: Fix fences with namespaces where no local processes are running + * PR #1472: Initialize nlocal and local in the tracker + * PR #1487: Sync. with master to fix info array and cross-version issues + * PR #1493/#1497/#1501/#1505/#1589: Info array and Cross-version fixes + * PR #1511/#1517/#1520/#1523/#1534/#1565: Fix pmix tests + * PR #1530: Improve handling of servers piror to v3.1.5 + * PR #1531: Update transfer from hash to dstore + * PR #1538: Fix singleton initialization + * PR #1547: Add missing PMIx_IOF_deregister function + * PR #1554/#1591: Fix memory leak on namespace deregister + * PR #1561: Configury fix for reproducible builds (boo#1047218) + * PR #1579: Protect pthread setpshared calls + * PR #1587: Fix to gds/dstore configure logic + * PR #1610: Adjust hotel timeout to be in whole seconds + * PR #1613: dstore: Fix cache size calculation + * PR #1622: Fix multiple occurrences of unaligned access in pmix tests + * PR #1620: Re-address the collective tracker problem + * PR #1625: Fix library version triplet + * PR #1630: Fix support for PGI compiler pgcc18 + * PR #1637: Realign behavior of PMIx_Get and PMIx_Get_nb + * PR #1640: Properly handle forwarded output when no handler registered + +------------------------------------------------------------------- +Thu Feb 13 15:59:50 UTC 2020 - Stanislav Brabec + +- Fix invalid RPM groups. + +------------------------------------------------------------------- +Fri Jan 10 13:30:55 UTC 2020 - Christian Goll + +- configuration can now also be provided with openmpi flavors + +------------------------------------------------------------------- +Mon Nov 25 14:57:45 UTC 2019 - Christian Goll + +- using now correct openSUSE:Shared library packaging policy +- removed pmi,pmi-2 as they are already part of slurm and mpi libs +- moved MCA-parameters to separate package +- implementing jsc#SLE-10791 + +------------------------------------------------------------------- +Fri Oct 25 08:21:37 UTC 2019 - Christian Goll + +- initial commit of version 3.1.4 diff --git a/pmix.spec b/pmix.spec new file mode 100644 index 0000000..627ab71 --- /dev/null +++ b/pmix.spec @@ -0,0 +1,211 @@ +# +# spec file for package pmix +# +# Copyright (c) 2023 SUSE LLC +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +# + +Name: pmix +Version: 3.2.3 +Release: 0 +Summary: Process Management Interface for MPI +License: BSD-3-Clause +Group: Development/Libraries/Parallel +URL: https://pmix.org/ +Source0: https://github.com/openpmix/openpmix/archive/v%{version}.tar.gz#/openpmix-%{version}.tar.gz +Patch0: Fix-a-potential-vulnerability-which-allows-chown-on-user-created-links.patch +BuildRequires: autoconf +BuildRequires: automake +BuildRequires: fdupes +BuildRequires: flex +BuildRequires: hwloc-devel +BuildRequires: libevent-devel +%ifarch x86_64 +BuildRequires: libpsm2-devel +%endif +BuildRequires: libtool +BuildRequires: munge-devel +BuildRequires: zlib-devel +BuildRoot: %{_tmppath}/%{name}-%{version}-build + +%description +The Process Management Interface (PMI) has been used for quite some time as a +means of exchanging wireup information needed for interprocess communication. Two +versions (PMI-1 and PMI-2) have been released as part of the MPICH effort. While +PMI-2 demonstrates better scaling properties than its PMI-1 predecessor, attaining +rapid launch and wireup of the roughly 1M processes executing across 100k nodes +expected for exascale operations remains challenging. + +This RPM contains all the tools necessary to compile and link against PMIx. + +%package -n libpmix2 +Summary: PMI-X lib version 1 +Group: System/Libraries +Requires: pmix-plugins = %version +Requires: pmix-runtime-config +Recommends: pmix-mca-params = %version + +%description -n libpmix2 +This package contains the shared library used by the PMI-X standard + +%package plugins +Summary: PMI-X plugins version 1 +Group: System/Libraries +Requires: libmca_common_dstore1 = %version +Requires: (pmix-plugin-munge = %version if munge) +Recommends: pmix-plugin-munge = %version +# explicit requires for package libmca_common_dstore1 +# as other providers for libmca_common_dstore.so.1 exist + +%description plugins +This package contains plugins used by libpmix2. + +%package plugin-munge +Summary: PMI-X munge plugin version 1 +Group: System/Libraries +Requires: libmca_common_dstore1 = %version +# explicit requires for package libmca_common_dstore1 +# as other providers for libmca_common_dstore.so.1 exist + +%description plugin-munge +This package contains the munge plugin for libpmix2. + +%package -n libmca_common_dstore1 +Summary: Communication library used by PMI-X +Group: System/Libraries + +%description -n libmca_common_dstore1 +This package contains the communication library used by the PMI + +%package devel +Summary: Process Management Interface for MPI +Group: Development/Libraries/C and C++ +Requires: %{name}-headers = %{version} +Requires: libmca_common_dstore1 = %{version} +Requires: libpmix2 = %{version} + +%description devel +This Package contains necessary files for development and building PMI-X +aware applications. + +%package headers +Summary: Process Management Interface for MPI +Group: Development/Libraries/C and C++ +BuildArch: noarch + +%description headers +This Package contains necessary the headers for PMI-X. + +%package -n pmix-mca-params +Summary: Settings for the Module Component Architecure +Group: Development/Libraries/C and C++ +Provides: pmix-runtime-config +Conflicts: pmix-runtime-config +BuildArch: noarch + +%description -n pmix-mca-params +PMIX is part of the Module Component Architecure and needs so to have its +parameters configured. + +%package test +Summary: Test packages for PMIx +Group: Development/Libraries/C and C++ + +%description test +Test binaries which allow to test proper PMIx operations. + +%prep +%setup -q -n openpmix-%{version} +%autopatch -p1 + +%build +./autogen.pl --force +%configure \ + --with-munge \ + --with-devel-headers \ + --disable-pmi-backward-compatibility \ + --enable-pmix-binaries \ + --with-tests-examples \ +%ifarch x86_64 + --with-psm2 \ +%endif + --with-hwloc \ + +make %{?_smp_mflags} + +%install +%make_install +# removed static libaries +rm -v %{buildroot}/%{_libdir}/*.la %{buildroot}/%{_libdir}/pmix/*.la +mkdir -p %{buildroot}/%{_libexecdir}/%{name}/test +for i in pmix_test pmix_client pmix_regex; do + cp test/.libs/$i %{buildroot}/%{_libexecdir}/%{name}/test +done +%fdupes %{buildroot}/%{_datadir} + +%check +make check + +%post -n libpmix2 -p /sbin/ldconfig +%postun -n libpmix2 -p /sbin/ldconfig + +%post -n libmca_common_dstore1 -p /sbin/ldconfig +%postun -n libmca_common_dstore1 -p /sbin/ldconfig + +%files +%doc README.md NEWS AUTHORS +%license LICENSE +%dir %{_libdir}/pmix +%{_datadir}/pmix +%{_bindir}/pevent +%{_bindir}/plookup +%{_bindir}/pmix_info +%{_bindir}/pps +#%%{_bindir}/pattrs +#%%{_bindir}/pmixcc +#%%{_bindir}/pquery + +%files -n pmix-mca-params +%config %{_sysconfdir}/pmix-mca-params.conf + +%files -n libpmix2 +%{_libdir}/libpmix.so.* + +%files plugins +%exclude %{_libdir}/pmix/mca_psec_munge.so +%{_libdir}/pmix/mca_*.so + +%files plugin-munge +%{_libdir}/pmix/mca_psec_munge.so + +%files -n libmca_common_dstore1 +%{_libdir}/libmca_common_dstore.so.* + +%files devel +%{_libdir}/libpmix.so +%{_libdir}/libmca_common_dstore.so +%{_libdir}/pkgconfig/pmix.pc + +%files headers +%dir %{_includedir}/pmix +%{_includedir}/pmix*.h +%{_includedir}/pmix/* + +%files test +%dir %{_libexecdir}/%{name} +%{_libexecdir}/%{name}/test + +%changelog