[am-utils/f19] - add fixes for bug 1074376.
Ian Kent
iankent at fedoraproject.org
Mon Mar 31 05:27:01 UTC 2014
commit b5481039d0ca6eecda29f486250f33fb28ce63d5
Author: Ian Kent <ikent at redhat.com>
Date: Mon Mar 31 13:26:24 2014 +0800
- add fixes for bug 1074376.
am-utils-6.1.5-check-fh-on-umount-succeeded.patch | 24 +++
am-utils-6.1.5-dont-background-autofs-umount.patch | 35 +++++
...ils-6.1.5-fix-autofs-proto-version-define.patch | 28 ++++
...le-ENOENT-umount-return-for-autofs-mounts.patch | 33 +++++
...9b652fb4-fix-handle-failed-umount-on-exit.patch | 13 ++
...0.git.9b652fb4-linux-umount-wait-on-ebusy.patch | 50 +++++++
...6.2-1.git.e03592f0-fix-debug-log-deadlock.patch | 82 +++++++++++
....git.e03592f0-fix-get_nfs_version-message.patch | 22 +++
...nodes-in-the-proper-order-when-going-down.patch | 152 ++++++++++++++++++++
am-utils.spec | 34 +++++-
10 files changed, 472 insertions(+), 1 deletions(-)
---
diff --git a/am-utils-6.1.5-check-fh-on-umount-succeeded.patch b/am-utils-6.1.5-check-fh-on-umount-succeeded.patch
new file mode 100644
index 0000000..5325438
--- /dev/null
+++ b/am-utils-6.1.5-check-fh-on-umount-succeeded.patch
@@ -0,0 +1,24 @@
+
+
+From: Ian Kent <raven at themaw.net>
+
+
+---
+ conf/autofs/autofs_linux.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/conf/autofs/autofs_linux.c b/conf/autofs/autofs_linux.c
+index 5e6a171..fd5dbc6 100644
+--- a/conf/autofs/autofs_linux.c
++++ b/conf/autofs/autofs_linux.c
+@@ -753,6 +753,10 @@ autofs_umount_succeeded(am_node *mp)
+ autofs_fh_t *fh = mp->am_parent->am_autofs_fh;
+ struct autofs_pending_umount **pp, *p;
+
++ /* Already gone? */
++ if (fh == NULL)
++ return 0;
++
+ pp = &fh->pending_umounts;
+ while (*pp && !STREQ((*pp)->name, mp->am_name))
+ pp = &(*pp)->next;
diff --git a/am-utils-6.1.5-dont-background-autofs-umount.patch b/am-utils-6.1.5-dont-background-autofs-umount.patch
new file mode 100644
index 0000000..7f8cde7
--- /dev/null
+++ b/am-utils-6.1.5-dont-background-autofs-umount.patch
@@ -0,0 +1,35 @@
+am-utils-6.1.5 - dont background autofs umount
+
+From: Ian Kent <ikent at redhat.com>
+
+When using an autofs multi-level mount map amd can fail to umount
+NFS leaf mounts causing shutdown to fail. It also can cause amd to
+SEGV because, even though umounts fail, the autofs mount control
+structure is freed and a later umount attempt doesn't check if this
+struct is valid before using it.
+
+The cause of the umount failure appears to be the background umount
+of NFS mounts at the leaf of the tree not finishing before the autofs
+file system mounts above are attempted.
+
+It isn't worth adding a patch to check if the autofs mount control
+structure is valid because if it isn't, in this case, amd doesn't
+crash but still becomes unresponsive.
+---
+ amd/map.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/amd/map.c b/amd/map.c
+index 2fad4b7..8e86b39 100644
+--- a/amd/map.c
++++ b/amd/map.c
+@@ -946,7 +946,8 @@ unmount_mp(am_node *mp)
+ #endif /* HAVE_FS_AUTOFS */
+
+ if ((mf->mf_fsflags & FS_UBACKGROUND) &&
+- (mf->mf_flags & MFF_MOUNTED)) {
++ (mf->mf_flags & MFF_MOUNTED) &&
++ !(mf->mf_flags & MFF_ON_AUTOFS)) {
+ dlog("Trying unmount in background");
+ run_task(unmount_node, (opaque_t) mp,
+ free_map_if_success, (opaque_t) mp);
diff --git a/am-utils-6.1.5-fix-autofs-proto-version-define.patch b/am-utils-6.1.5-fix-autofs-proto-version-define.patch
new file mode 100644
index 0000000..8b04bcc
--- /dev/null
+++ b/am-utils-6.1.5-fix-autofs-proto-version-define.patch
@@ -0,0 +1,28 @@
+am-utils-6.1.5 - fix autofs proto version define
+
+From: Ian Kent <raven at themaw.net>
+
+I don't think am-utils works with autofs protocol version 5.
+---
+
+ conf/autofs/autofs_linux.c | 5 ++++-
+ 1 files changed, 4 insertions(+), 1 deletions(-)
+
+
+diff --git a/conf/autofs/autofs_linux.c b/conf/autofs/autofs_linux.c
+index f56befa..eeb211f 100644
+--- a/conf/autofs/autofs_linux.c
++++ b/conf/autofs/autofs_linux.c
+@@ -59,8 +59,11 @@
+ */
+
+ #define AUTOFS_MIN_VERSION 3
++#if AUTOFS_MAX_PROTO_VERSION >= 5
++#define AUTOFS_MAX_VERSION 4
++#else
+ #define AUTOFS_MAX_VERSION AUTOFS_MAX_PROTO_VERSION
+-
++#endif
+
+ /*
+ * STRUCTURES:
diff --git a/am-utils-6.1.5-handle-ENOENT-umount-return-for-autofs-mounts.patch b/am-utils-6.1.5-handle-ENOENT-umount-return-for-autofs-mounts.patch
new file mode 100644
index 0000000..5785898
--- /dev/null
+++ b/am-utils-6.1.5-handle-ENOENT-umount-return-for-autofs-mounts.patch
@@ -0,0 +1,33 @@
+am-utils-6.1.5 - handle ENOENT umount return for autofs mounts
+
+From: Ian Kent <ikent at redhat.com>
+
+An ENOENT return from umount(2) means the kernel path walk couldn't
+resolve the path of the mount to a dentry. In that case there can't
+be an autofs waitq entry waiting for notification, since there's no
+dentry, so don't even try to notify the kernel.
+---
+ amd/map.c | 10 ++++++----
+ 1 file changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/amd/map.c b/amd/map.c
+index 8e86b39..e6d14b8 100644
+--- a/amd/map.c
++++ b/amd/map.c
+@@ -873,10 +873,12 @@ free_map_if_success(int rc, int term, opaque_t arg)
+ else
+ plog(XLOG_ERROR, "%s: unmount: %s", mp->am_path, strerror(rc));
+ #ifdef HAVE_FS_AUTOFS
+- if (mf->mf_flags & MFF_IS_AUTOFS)
+- autofs_get_mp(mp);
+- if (mp->am_flags & AMF_AUTOFS)
+- autofs_umount_failed(mp);
++ if (rc != ENOENT) {
++ if (mf->mf_flags & MFF_IS_AUTOFS)
++ autofs_get_mp(mp);
++ if (mp->am_flags & AMF_AUTOFS)
++ autofs_umount_failed(mp);
++ }
+ #endif /* HAVE_FS_AUTOFS */
+ amd_stats.d_uerr++;
+ } else {
diff --git a/am-utils-6.2-0.git.9b652fb4-fix-handle-failed-umount-on-exit.patch b/am-utils-6.2-0.git.9b652fb4-fix-handle-failed-umount-on-exit.patch
new file mode 100644
index 0000000..7ece413
--- /dev/null
+++ b/am-utils-6.2-0.git.9b652fb4-fix-handle-failed-umount-on-exit.patch
@@ -0,0 +1,13 @@
+diff -up am-utils-6.1.5/amd/map.c.orig am-utils-6.1.5/amd/map.c
+--- am-utils-6.1.5/amd/map.c.orig 2014-03-19 19:45:45.000000000 +0800
++++ am-utils-6.1.5/amd/map.c 2014-03-19 19:47:42.741848068 +0800
+@@ -748,7 +748,8 @@ umount_exported(void)
+ } else {
+ am_unmounted(mp);
+ }
+- exported_ap[i] = NULL;
++ if (!(mf->mf_flags && (MFF_UNMOUNTING|MFF_MOUNTED)))
++ exported_ap[i] = NULL;
+ } else {
+ /*
+ * Any other node gets forcibly timed out.
diff --git a/am-utils-6.2-0.git.9b652fb4-linux-umount-wait-on-ebusy.patch b/am-utils-6.2-0.git.9b652fb4-linux-umount-wait-on-ebusy.patch
new file mode 100644
index 0000000..3896c68
--- /dev/null
+++ b/am-utils-6.2-0.git.9b652fb4-linux-umount-wait-on-ebusy.patch
@@ -0,0 +1,50 @@
+am-utils-6.2-0.git.9b652fb4 - linux umount wait on ebusy
+
+From: Ian Kent <ikent at redhat.com>
+
+For some reason, when umounting autofs mounts after closing the ioctl
+file handle, the kernel can return EBUSY for some small amount of time.
+
+This can cause umounts to incorrectly fail when in fact they should
+succeed.
+
+Retrying for about a second and a half seems to work quite well.
+---
+ conf/umount/umount_linux.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/conf/umount/umount_linux.c b/conf/umount/umount_linux.c
+index 782c2cd..81b0527 100644
+--- a/conf/umount/umount_linux.c
++++ b/conf/umount/umount_linux.c
+@@ -63,6 +63,7 @@ umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags)
+ char loopstr[] = "loop=";
+ char *loopdev;
+ #endif /* HAVE_LOOP_DEVICE */
++ unsigned int retries = 8;
+
+ mp = mlist = read_mtab(mntdir, mnttabname);
+
+@@ -94,6 +95,7 @@ umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags)
+ unlock_mntlist();
+ #endif /* MOUNT_TABLE_ON_FILE */
+
++again:
+ #if defined(HAVE_UMOUNT2) && defined(MNT2_GEN_OPT_DETACH)
+ /*
+ * If user asked to try forced unmounts, then do a quick check to see if
+@@ -111,6 +113,14 @@ umount_fs(char *mntdir, const char *mnttabname, u_int unmount_flags)
+ } else
+ #endif /* defined(HAVE_UMOUNT2) && defined(MNT2_GEN_OPT_DETACH) */
+ error = UNMOUNT_TRAP(mp_save->mnt);
++
++ /* Linux kernel can be sluggish for some reason */
++ if (error == EBUSY && retries--) {
++ struct timespec tm = {0, 200000000};
++ nanosleep(&tm, NULL);
++ goto again;
++ }
++
+ if (error < 0) {
+ plog(XLOG_WARNING, "unmount(%s) failed: %m", mp_save->mnt->mnt_dir);
+ switch ((error = errno)) {
diff --git a/am-utils-6.2-1.git.e03592f0-fix-debug-log-deadlock.patch b/am-utils-6.2-1.git.e03592f0-fix-debug-log-deadlock.patch
new file mode 100644
index 0000000..442442d
--- /dev/null
+++ b/am-utils-6.2-1.git.e03592f0-fix-debug-log-deadlock.patch
@@ -0,0 +1,82 @@
+am-utils-6.2-1.git.e03592f0 - fix debug log deadlock
+
+From: Ian Kent <raven at themaw.net>
+
+It's possible (and likely) a SIGCHLD signal can arrive while in syslog(2)
+and also attempt log log a message leading to deadlock.
+---
+ libamu/xutil.c | 38 ++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 38 insertions(+)
+
+diff --git a/libamu/xutil.c b/libamu/xutil.c
+index b3e3a0f..0d9d2ec 100644
+--- a/libamu/xutil.c
++++ b/libamu/xutil.c
+@@ -420,14 +420,33 @@ debug_option(char *opt)
+ void
+ dplog(const char *fmt, ...)
+ {
++#ifdef HAVE_SIGACTION
++ sigset_t old, chld;
++#else /* not HAVE_SIGACTION */
++ int mask;
++#endif /* not HAVE_SIGACTION */
+ va_list ap;
+
++#ifdef HAVE_SIGACTION
++ sigemptyset(&chld);
++ sigaddset(&chld, SIGCHLD);
++#else /* not HAVE_SIGACTION */
++ mask = sigblock(sigmask(SIGCHLD));
++#endif /* not HAVE_SIGACTION */
++
++ sigprocmask(SIG_BLOCK, &chld, &old);
+ if (!logfp)
+ logfp = stderr; /* initialize before possible first use */
+
+ va_start(ap, fmt);
+ real_plog(XLOG_DEBUG, fmt, ap);
+ va_end(ap);
++
++#ifdef HAVE_SIGACTION
++ sigprocmask(SIG_SETMASK, &old, NULL);
++#else /* not HAVE_SIGACTION */
++ mask = sigblock(sigmask(SIGCHLD));
++#endif /* not HAVE_SIGACTION */
+ }
+ #endif /* DEBUG */
+
+@@ -435,14 +454,33 @@ dplog(const char *fmt, ...)
+ void
+ plog(int lvl, const char *fmt, ...)
+ {
++#ifdef HAVE_SIGACTION
++ sigset_t old, chld;
++#else /* not HAVE_SIGACTION */
++ int mask;
++#endif /* not HAVE_SIGACTION */
+ va_list ap;
+
++#ifdef HAVE_SIGACTION
++ sigemptyset(&chld);
++ sigaddset(&chld, SIGCHLD);
++ sigprocmask(SIG_BLOCK, &chld, &old);
++#else /* not HAVE_SIGACTION */
++ mask = sigblock(sigmask(SIGCHLD));
++#endif /* not HAVE_SIGACTION */
++
+ if (!logfp)
+ logfp = stderr; /* initialize before possible first use */
+
+ va_start(ap, fmt);
+ real_plog(lvl, fmt, ap);
+ va_end(ap);
++
++#ifdef HAVE_SIGACTION
++ sigprocmask(SIG_SETMASK, &old, NULL);
++#else /* not HAVE_SIGACTION */
++ sigsetmask(mask);
++#endif /* not HAVE_SIGACTION */
+ }
+
+
diff --git a/am-utils-6.2-1.git.e03592f0-fix-get_nfs_version-message.patch b/am-utils-6.2-1.git.e03592f0-fix-get_nfs_version-message.patch
new file mode 100644
index 0000000..76e438f
--- /dev/null
+++ b/am-utils-6.2-1.git.e03592f0-fix-get_nfs_version-message.patch
@@ -0,0 +1,22 @@
+am-utils-6.2-1.git.e03592f0 - fix get_nfs_version() message
+
+From: Ian Kent <ikent at redhat.com>
+
+Fix a error message formating mistake in get_nfs_version().
+---
+ conf/transp/transp_sockets.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/conf/transp/transp_sockets.c b/conf/transp/transp_sockets.c
+index d5e729f..5036b26 100644
+--- a/conf/transp/transp_sockets.c
++++ b/conf/transp/transp_sockets.c
+@@ -478,7 +478,7 @@ try_again:
+ }
+
+ if (errstr) {
+- plog(XLOG_INFO, "get_nfs_version NFS(%d,%s) failed for %s%s",
++ plog(XLOG_INFO, "get_nfs_version NFS(%d,%s) failed for %s: %s",
+ (int) nfs_version, proto, host, errstr);
+ if (again) {
+ #ifdef HAVE_FS_NFS3
diff --git a/am-utils-6.2-make-sure-to-remove-nodes-in-the-proper-order-when-going-down.patch b/am-utils-6.2-make-sure-to-remove-nodes-in-the-proper-order-when-going-down.patch
new file mode 100644
index 0000000..c5878bf
--- /dev/null
+++ b/am-utils-6.2-make-sure-to-remove-nodes-in-the-proper-order-when-going-down.patch
@@ -0,0 +1,152 @@
+diff -up am-utils-6.1.5/amd/map.c.orig am-utils-6.1.5/amd/map.c
+--- am-utils-6.1.5/amd/map.c.orig 2014-03-19 19:34:23.000000000 +0800
++++ am-utils-6.1.5/amd/map.c 2014-03-19 19:44:17.918101095 +0800
+@@ -687,68 +687,80 @@ make_root_node(void)
+ void
+ umount_exported(void)
+ {
+- int i;
++ int i, work_done;
+
+- for (i = last_used_map; i >= 0; --i) {
+- am_node *mp = exported_ap[i];
+- mntfs *mf;
++ do {
++ work_done = 0;
+
+- if (!mp)
+- continue;
++ for (i = last_used_map; i >= 0; --i) {
++ am_node *mp = exported_ap[i];
++ mntfs *mf;
+
+- mf = mp->am_mnt;
+- if (mf->mf_flags & MFF_UNMOUNTING) {
+- /*
+- * If this node is being unmounted then just ignore it. However,
+- * this could prevent amd from finishing if the unmount gets blocked
+- * since the am_node will never be free'd. am_unmounted needs
+- * telling about this possibility. - XXX
+- */
+- continue;
+- }
++ if (!mp)
++ continue;
+
+- if (!(mf->mf_fsflags & FS_DIRECTORY))
+ /*
+- * When shutting down this had better
+- * look like a directory, otherwise it
+- * can't be unmounted!
++ * Wait for children to be removed first
+ */
+- mk_fattr(&mp->am_fattr, NFDIR);
++ if (mp->am_child)
++ continue;
+
+- if ((--immediate_abort < 0 &&
+- !(mp->am_flags & AMF_ROOT) && mp->am_parent) ||
+- (mf->mf_flags & MFF_RESTART)) {
++ mf = mp->am_mnt;
++ if (mf->mf_flags & MFF_UNMOUNTING) {
++ /*
++ * If this node is being unmounted then just ignore it. However,
++ * this could prevent amd from finishing if the unmount gets blocked
++ * since the am_node will never be free'd. am_unmounted needs
++ * telling about this possibility. - XXX
++ */
++ continue;
++ }
+
+- /*
+- * Just throw this node away without bothering to unmount it. If
+- * the server is not known to be up then don't discard the mounted
+- * on directory or Amd might hang...
+- */
+- if (mf->mf_server &&
++ if (!(mf->mf_fsflags & FS_DIRECTORY))
++ /*
++ * When shutting down this had better
++ * look like a directory, otherwise it
++ * can't be unmounted!
++ */
++ mk_fattr(&mp->am_fattr, NFDIR);
++
++ if ((--immediate_abort < 0 &&
++ !(mp->am_flags & AMF_ROOT) && mp->am_parent) ||
++ (mf->mf_flags & MFF_RESTART)) {
++
++ work_done++;
++
++ /*
++ * Just throw this node away without bothering to unmount it. If
++ * the server is not known to be up then don't discard the mounted
++ * on directory or Amd might hang...
++ */
++ if (mf->mf_server &&
+ (mf->mf_server->fs_flags & (FSF_DOWN | FSF_VALID)) != FSF_VALID)
+ mf->mf_flags &= ~MFF_MKMNT;
+- if (gopt.flags & CFM_UNMOUNT_ON_EXIT || mp->am_flags & AMF_AUTOFS) {
+- plog(XLOG_INFO, "on-exit attempt to unmount %s", mf->mf_mount);
+- /*
+- * use unmount_mp, not unmount_node, so that unmounts be
+- * backgrounded as needed.
+- */
+- unmount_mp((opaque_t) mp);
+- } else {
+- am_unmounted(mp);
+- }
+- exported_ap[i] = 0;
+- } else {
+- /*
+- * Any other node gets forcibly timed out.
+- */
+- mp->am_flags &= ~AMF_NOTIMEOUT;
+- mp->am_mnt->mf_flags &= ~MFF_RSTKEEP;
+- mp->am_ttl = 0;
+- mp->am_timeo = 1;
+- mp->am_timeo_w = 0;
+- }
+- }
++ if (gopt.flags & CFM_UNMOUNT_ON_EXIT || mp->am_flags & AMF_AUTOFS) {
++ plog(XLOG_INFO, "on-exit attempt to unmount %s", mf->mf_mount);
++ /*
++ * use unmount_mp, not unmount_node, so that unmounts be
++ * backgrounded as needed.
++ */
++ unmount_mp((opaque_t) mp);
++ } else {
++ am_unmounted(mp);
++ }
++ exported_ap[i] = NULL;
++ } else {
++ /*
++ * Any other node gets forcibly timed out.
++ */
++ mp->am_flags &= ~AMF_NOTIMEOUT;
++ mp->am_mnt->mf_flags &= ~MFF_RSTKEEP;
++ mp->am_ttl = 0;
++ mp->am_timeo = 1;
++ mp->am_timeo_w = 0;
++ }
++ }
++ } while (work_done);
+ }
+
+
+diff -U0 am-utils-6.1.5/ChangeLog.orig am-utils-6.1.5/ChangeLog
+--- am-utils-6.1.5/ChangeLog.orig 2006-05-12 01:25:47.000000000 +0800
++++ am-utils-6.1.5/ChangeLog 2014-03-19 19:36:27.335598581 +0800
+@@ -0,0 +1,12 @@
++2009-12-10 Christos Zoulas <christos at zoulas.com>
++
++ * Make sure to remove nodes in the proper order when going
++ down. Depending on what order the nodes got created it's
++ possible that the parent of a node has a bigger am_mapno
++ (index in exported_ap[]) so that it gets freed before
++ its child while the child's am_parent pointer is still
++ pointing to the already freed block of memory.
++ This change makes sure that umount_exported() cleans up
++ all children of a node first before freeing the node.
++ From: Krisztian Kovacs <Kris.Kovacs at morganstanley.com>
++
diff --git a/am-utils.spec b/am-utils.spec
index 5578fde..aabecd4 100644
--- a/am-utils.spec
+++ b/am-utils.spec
@@ -1,7 +1,7 @@
Summary: Automount utilities including an updated version of Amd
Name: am-utils
Version: 6.1.5
-Release: 28%{?dist}
+Release: 30%{?dist}
License: BSD
Epoch: 5
Group: System Environment/Daemons
@@ -59,6 +59,17 @@ Patch8: am-utils-6.1.5-use-_hardened_build-flag.patch
# Fix documentation build fails.
Patch9: am-utils-6.1.5-texinfo-documentation-build-fixes.patch
+Patch10: am-utils-6.1.5-dont-background-autofs-umount.patch
+Patch11: am-utils-6.1.5-check-fh-on-umount-succeeded.patch
+Patch12: am-utils-6.1.5-handle-ENOENT-umount-return-for-autofs-mounts.patch
+Patch13: am-utils-6.2-1.git.e03592f0-fix-get_nfs_version-message.patch
+Patch14: am-utils-6.2-1.git.e03592f0-fix-debug-log-deadlock.patch
+Patch15: am-utils-6.2-0.git.9b652fb4-linux-umount-wait-on-ebusy.patch
+Patch16: am-utils-6.2-make-sure-to-remove-nodes-in-the-proper-order-when-going-down.patch
+Patch17: am-utils-6.2-0.git.9b652fb4-fix-handle-failed-umount-on-exit.patch
+# Don't attempt to use v5 protocol
+Patch18: am-utils-6.1.5-fix-autofs-proto-version-define.patch
+
%global _hardened_build 1
# We need to filter out some perl requirements for now.
@@ -88,6 +99,15 @@ mounting and unmounting filesystems.
%patch7 -p1
%patch8 -p1
%patch9 -p1
+%patch10 -p1
+%patch11 -p1
+%patch12 -p1
+%patch13 -p1
+%patch14 -p1
+%patch15 -p1
+%patch16 -p1
+%patch17 -p1
+%patch18 -p1
find_requires=%{old_find_requires}
echo "$find_requires | grep -v lostaltmail.conf" > find-requires
@@ -199,6 +219,18 @@ fi
%{_libdir}/libamu.so*
%changelog
+* Mon Mar 31 2014 Ian Kent <ikent at redhat.com> - 5:6.1.5-30
+- bz1074376 - am-utils will no longer start due to missing NFSv2
+ - dont background autofs umount.
+ - check fh on umount succeeded.
+ - handle ENOENT umount return for autofs mounts.
+ - fix get_nfs_version() message.
+ - fix debug log deadlock.
+ - linux umount wait on ebusy.
+ - make sure to remove nodes in the proper order when going down.
+ - fix handle failed umount on exit.
+ - fix autofs proto version define.
+
* Mon May 13 2013 Ian Kent <ikent at redhat.com> - 5:6.1.5-28
- bz955445 - am-utils package should be built with PIE flags
- use _hardened_build flag.
More information about the scm-commits
mailing list