diff options
-rw-r--r-- | .SRCINFO | 8 | ||||
-rw-r--r-- | 0001-libmount-FS-id-and-parent-ID-could-be-zero.patch | 98 | ||||
-rw-r--r-- | 0001-switch_root-verify-initramfs-by-f_type-not-devno.patch | 59 | ||||
-rw-r--r-- | PKGBUILD | 21 | ||||
-rw-r--r-- | move_is_mountinfo.patch | 46 |
5 files changed, 228 insertions, 4 deletions
@@ -1,7 +1,7 @@ pkgbase = util-linux-selinux pkgdesc = SELinux aware miscellaneous system utilities for Linux pkgver = 2.24.1 - pkgrel = 3 + pkgrel = 4 url = http://www.kernel.org/pub/linux/utils/util-linux/ arch = i686 arch = x86_64 @@ -16,11 +16,17 @@ pkgbase = util-linux-selinux source = pam-login source = pam-common source = pam-su + source = move_is_mountinfo.patch + source = 0001-switch_root-verify-initramfs-by-f_type-not-devno.patch + source = 0001-libmount-FS-id-and-parent-ID-could-be-zero.patch md5sums = 88d46ae23ca599ac5af9cf96b531590f md5sums = a39554bfd65cccfd8254bb46922f4a67 md5sums = 4368b3f98abd8a32662e094c54e7f9b1 md5sums = a31374fef2cba0ca34dfc7078e2969e4 md5sums = fa85e5cce5d723275b14365ba71a8aad + md5sums = 4cdc5f9a6e51b032274761a82937d438 + md5sums = b7ca79a0d5318b7cd813bb2573a3f9a9 + md5sums = 2f4bc305bd11d6bfaa81e6c1eb0c6f1b pkgname = util-linux-selinux install = util-linux.install diff --git a/0001-libmount-FS-id-and-parent-ID-could-be-zero.patch b/0001-libmount-FS-id-and-parent-ID-could-be-zero.patch new file mode 100644 index 000000000000..01a8d441bb04 --- /dev/null +++ b/0001-libmount-FS-id-and-parent-ID-could-be-zero.patch @@ -0,0 +1,98 @@ +From 6c373810f5b1d32824371e9dff6ee5a006388f98 Mon Sep 17 00:00:00 2001 +From: Karel Zak <kzak@redhat.com> +Date: Thu, 20 Feb 2014 16:59:11 +0100 +Subject: [PATCH] libmount: FS id and parent ID could be zero +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +It seems that linux 3.14 is able to produce things like: + + 19 0 8:3 / / rw,relatime - ext4 /dev/sda3 rw,data=ordered + ^ + +Reported-by: Mantas Mikulėnas <grawity@gmail.com> +Signed-off-by: Karel Zak <kzak@redhat.com> +--- + libmount/src/tab.c | 12 ++++-------- + misc-utils/findmnt.c | 5 +++-- + 2 files changed, 7 insertions(+), 10 deletions(-) + +diff --git a/libmount/src/tab.c b/libmount/src/tab.c +index 4c2f8a4..332312b 100644 +--- a/libmount/src/tab.c ++++ b/libmount/src/tab.c +@@ -505,7 +505,7 @@ int mnt_table_get_root_fs(struct libmnt_table *tb, struct libmnt_fs **root) + assert(tb); + assert(root); + +- if (!tb || !root) ++ if (!tb || !root || !is_mountinfo(tb)) + return -EINVAL; + + DBG(TAB, mnt_debug_h(tb, "lookup root fs")); +@@ -515,8 +515,6 @@ int mnt_table_get_root_fs(struct libmnt_table *tb, struct libmnt_fs **root) + mnt_reset_iter(&itr, MNT_ITER_FORWARD); + while(mnt_table_next_fs(tb, &itr, &fs) == 0) { + int id = mnt_fs_get_parent_id(fs); +- if (!id) +- break; /* @tab is not a mountinfo file? */ + + if (!*root || id < root_id) { + *root = fs; +@@ -524,7 +522,7 @@ int mnt_table_get_root_fs(struct libmnt_table *tb, struct libmnt_fs **root) + } + } + +- return root_id ? 0 : -EINVAL; ++ return *root ? 0 : -EINVAL; + } + + /** +@@ -545,15 +543,13 @@ int mnt_table_next_child_fs(struct libmnt_table *tb, struct libmnt_iter *itr, + struct libmnt_fs *fs; + int parent_id, lastchld_id = 0, chld_id = 0; + +- if (!tb || !itr || !parent) ++ if (!tb || !itr || !parent || !is_mountinfo(tb)) + return -EINVAL; + + DBG(TAB, mnt_debug_h(tb, "lookup next child of '%s'", + mnt_fs_get_target(parent))); + + parent_id = mnt_fs_get_id(parent); +- if (!parent_id) +- return -EINVAL; + + /* get ID of the previously returned child */ + if (itr->head && itr->p != itr->head) { +@@ -584,7 +580,7 @@ int mnt_table_next_child_fs(struct libmnt_table *tb, struct libmnt_iter *itr, + } + } + +- if (!chld_id) ++ if (!*chld) + return 1; /* end of iterator */ + + /* set the iterator to the @chld for the next call */ +diff --git a/misc-utils/findmnt.c b/misc-utils/findmnt.c +index fb21174..988cd73 100644 +--- a/misc-utils/findmnt.c ++++ b/misc-utils/findmnt.c +@@ -822,8 +822,9 @@ static int tab_is_tree(struct libmnt_table *tb) + if (!itr) + return 0; + +- if (mnt_table_next_fs(tb, itr, &fs) == 0) +- rc = mnt_fs_get_id(fs) > 0 && mnt_fs_get_parent_id(fs) > 0; ++ rc = (mnt_table_next_fs(tb, itr, &fs) == 0 && ++ mnt_fs_is_kernel(fs) && ++ mnt_fs_get_root(fs)); + + mnt_free_iter(itr); + return rc; +-- +1.9.1 + diff --git a/0001-switch_root-verify-initramfs-by-f_type-not-devno.patch b/0001-switch_root-verify-initramfs-by-f_type-not-devno.patch new file mode 100644 index 000000000000..56191a30e760 --- /dev/null +++ b/0001-switch_root-verify-initramfs-by-f_type-not-devno.patch @@ -0,0 +1,59 @@ +From 751c39383adaf5ff5a860516238d524b0e20f835 Mon Sep 17 00:00:00 2001 +From: Dave Reisner <dreisner@archlinux.org> +Date: Wed, 2 Apr 2014 10:41:30 -0400 +Subject: [PATCH] switch_root: verify initramfs by f_type, not devno + +As of linux 3.14, the initramfs device will have both major and +minor 0, causing our paranoia check to fail. Make this version agnostic +by checking the filesystem type, rather than a device number. + +[adopted from master for backport into 2.24.x branch] + +Signed-off-by: Dave Reisner <dreisner@archlinux.org> +--- + sys-utils/switch_root.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +diff --git a/sys-utils/switch_root.c b/sys-utils/switch_root.c +index f26f7da..40e222d 100644 +--- a/sys-utils/switch_root.c ++++ b/sys-utils/switch_root.c +@@ -23,6 +23,7 @@ + #include <sys/mount.h> + #include <sys/types.h> + #include <sys/stat.h> ++#include <sys/statfs.h> + #include <sys/param.h> + #include <fcntl.h> + #include <stdio.h> +@@ -33,6 +34,8 @@ + #include <ctype.h> + #include <dirent.h> + ++#include <linux/magic.h> ++ + #include "c.h" + #include "nls.h" + #include "closestream.h" +@@ -174,12 +177,12 @@ static int switchroot(const char *newroot) + if (cfd >= 0) { + pid = fork(); + if (pid <= 0) { +- if (fstat(cfd, &sb) == 0) { +- if (sb.st_dev == makedev(0, 1)) +- recursiveRemove(cfd); +- else +- warn(_("old root filesystem is not an initramfs")); +- } ++ struct statfs stfs; ++ if (fstatfs(cfd, &stfs) == 0 && ++ (stfs.f_type == RAMFS_MAGIC || stfs.f_type == TMPFS_MAGIC)) ++ recursiveRemove(cfd); ++ else ++ warn(_("old root filesystem is not an initramfs")); + + if (pid == 0) + exit(EXIT_SUCCESS); +-- +1.9.1 + @@ -4,11 +4,12 @@ # Contributor: judd <jvinet@zeroflux.org> # SELinux Maintainer: Timothée Ravier <tim@siosm.fr> # SELinux Contributor: Nicky726 <nicky726@gmail.com> +# SELinux Contributor: Nicolas Iooss (nicolas <dot> iooss <at> m4x <dot> org) pkgbase=util-linux-selinux pkgname=(util-linux-selinux libutil-linux-selinux) pkgver=2.24.1 -pkgrel=3 +pkgrel=4 pkgdesc="SELinux aware miscellaneous system utilities for Linux" url="http://www.kernel.org/pub/linux/utils/util-linux/" arch=('i686' 'x86_64') @@ -26,12 +27,26 @@ source=("ftp://ftp.kernel.org/pub/linux/utils/${pkgname/-selinux}/v2.24/${pkgnam uuidd.tmpfiles pam-login pam-common - pam-su) + pam-su + move_is_mountinfo.patch + 0001-switch_root-verify-initramfs-by-f_type-not-devno.patch + 0001-libmount-FS-id-and-parent-ID-could-be-zero.patch) md5sums=('88d46ae23ca599ac5af9cf96b531590f' 'a39554bfd65cccfd8254bb46922f4a67' '4368b3f98abd8a32662e094c54e7f9b1' 'a31374fef2cba0ca34dfc7078e2969e4' - 'fa85e5cce5d723275b14365ba71a8aad') + 'fa85e5cce5d723275b14365ba71a8aad' + '4cdc5f9a6e51b032274761a82937d438' + 'b7ca79a0d5318b7cd813bb2573a3f9a9' + '2f4bc305bd11d6bfaa81e6c1eb0c6f1b') + +prepare() { + cd "${pkgname/-selinux}-$pkgver" + + patch -p1 -i "${srcdir}/move_is_mountinfo.patch" + patch -p1 -i "${srcdir}/0001-libmount-FS-id-and-parent-ID-could-be-zero.patch" + patch -p1 -i "${srcdir}/0001-switch_root-verify-initramfs-by-f_type-not-devno.patch" +} build() { cd "${pkgname/-selinux}-$pkgver" diff --git a/move_is_mountinfo.patch b/move_is_mountinfo.patch new file mode 100644 index 000000000000..ad9387efc3a3 --- /dev/null +++ b/move_is_mountinfo.patch @@ -0,0 +1,46 @@ +diff --git a/libmount/src/tab.c b/libmount/src/tab.c +index 3633b6a..8ae49c8 100644 +--- a/libmount/src/tab.c ++++ b/libmount/src/tab.c +@@ -47,6 +47,20 @@ + #include "strutils.h" + #include "loopdev.h" + ++static int is_mountinfo(struct libmnt_table *tb) ++{ ++ struct libmnt_fs *fs; ++ ++ if (!tb) ++ return 0; ++ ++ fs = list_first_entry(&tb->ents, struct libmnt_fs, ents); ++ if (fs && mnt_fs_is_kernel(fs) && mnt_fs_get_root(fs)) ++ return 1; ++ ++ return 0; ++} ++ + /** + * mnt_new_table: + * +@@ -1229,20 +1335,6 @@ err: + return NULL; + } + +-static int is_mountinfo(struct libmnt_table *tb) +-{ +- struct libmnt_fs *fs; +- +- if (!tb) +- return 0; +- +- fs = list_first_entry(&tb->ents, struct libmnt_fs, ents); +- if (fs && mnt_fs_is_kernel(fs) && mnt_fs_get_root(fs)) +- return 1; +- +- return 0; +-} +- + /** + * mnt_table_is_fs__mounted: + * @tb: /proc/self/mountinfo file |