util-linux: import from upstream Gentoo

Grab the latest stable version from upstream.

BUG=chromium-os:24839
TEST=`emerge util-linux` works
TEST=`emerge-arm-generic util-linux` works
TEST=build_packages+build_image for x86-alex boots up
CQ-DEPEND=Ie30c3b74003fa8aa99109ebf60d77f61864a2c1c

Change-Id: Id029e027711451a79baa57f11af8049e545a9551
Reviewed-on: https://gerrit.chromium.org/gerrit/12624
Reviewed-by: Ben Chan <benchan@chromium.org>
Reviewed-by: David James <davidjames@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Ready: Mike Frysinger <vapier@chromium.org>
This commit is contained in:
Mike Frysinger 2011-11-14 23:50:11 -05:00 committed by Gerrit
parent 60b16d6bf0
commit 5f8a90b910
5 changed files with 378 additions and 0 deletions

View File

@ -0,0 +1,9 @@
# /etc/conf.d/crypto-loop: Configuration file for /etc/init.d/crypto-loop
# More info can be found in the init.d script
# Specify loopback configurations here. The format of this file is
# shown in the following commented-out example. One line per loopback
# configuration. For possible hash values, see `man hashalot`.
# loop=/dev/loop0 hash='' cipher=serpent keysize=256 device=/dev/system/test other=''

View File

@ -0,0 +1,70 @@
#!/sbin/runscript
# Copyright 1999-2005 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-apps/util-linux/files/crypto-loop.initd,v 1.4 2008/10/26 03:16:48 vapier Exp $
depend() {
if [ -x /etc/init.d/root ]; then
need root
else
need checkroot
fi
need modules
before localmount
}
start() {
local status="0"
ebegin "Starting crypto loop devices"
if [ -e /etc/conf.d/crypto-loop ] ; then
egrep "^loop" /etc/conf.d/crypto-loop | \
while read loopline ; do
eval ${loopline}
local configured=$(awk -v MOUNT="${device}" \
'($2 == MOUNT) { print "yes" }' /proc/mounts)
if [ "${configured}" != "yes" ] ; then
einfo " Loop ${loop} on device ${device} (cipher ${cipher}, key size ${keysize}): "
if [ -n "${hash}" ] ; then
/usr/sbin/hashalot -n ${keysize} ${hash} </dev/tty|\
/sbin/losetup -p 0 -e ${cipher}-${keysize} ${loop} ${device} ${other}
else
/sbin/losetup -e ${cipher}-${keysize} ${loop} ${device} ${other}
fi
if [ $? -ne 0 ] ; then
ewarn "Failure configuring ${loop}. Skipping."
status=1
fi
else
ewarn " Loop ${loop} on device ${device} are already configured"
fi
done
fi
ewend ${status} "Failed to start some loop devices."
# We do not fail if some loop devices did not start ...
return 0
}
stop() {
local status="0"
for loop in $(ls /dev/loop[0-9] 2>/dev/null) ; do
losetup ${loop} > /dev/null 2>&1
if [ $? -eq 0 ] ; then
( umount ${loop} || swapoff "${loop}" ) >/dev/null 2>&1
if ! /sbin/losetup -d ${loop} > /dev/null 2>&1; then
ewarn "Failure deconfiguring ${loop}."
status=1
fi
fi
done
ewend ${status}
}
# vim:ts=4

View File

@ -0,0 +1,86 @@
https://bugs.gentoo.org/366213
From f53edda83ebcfd7015c3f35196d6cbd7bc2d8369 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Wed, 11 May 2011 16:57:27 +0200
Subject: [PATCH] mount: -a segfaults when 4th field is omitted (mount
options)
# echo 'tmpd /tmp/x tmpfs' >> /etc/fstab
# mkdir /tmp/x
# mount -a
segfault
Reported-by: Mike Frysinger <vapier@gentoo.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
---
mount/mount.c | 8 +++++---
mount/mount_mntent.c | 5 +++--
mount/sundries.c | 2 ++
3 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/mount/mount.c b/mount/mount.c
index ba71149..29963c2 100644
--- a/mount/mount.c
+++ b/mount/mount.c
@@ -1163,7 +1163,9 @@ is_mounted_same_loopfile(const char *node0, const char *loopfile, unsigned long
res = loopfile_used_with((char *) mnt->m.mnt_fsname,
loopfile, offset);
- else if ((p = strstr(mnt->m.mnt_opts, "loop="))) {
+ else if (mnt->m.mnt_opts &&
+ (p = strstr(mnt->m.mnt_opts, "loop=")))
+ {
char *dev = xstrdup(p+5);
if ((p = strchr(dev, ',')))
*p = '\0';
@@ -2052,8 +2054,8 @@ is_fstab_entry_mounted(struct mntentchn *mc, int verbose)
goto yes;
/* extra care for loop devices */
- if ((strstr(mc->m.mnt_opts, "loop=") ||
- (stat(mc->m.mnt_fsname, &st) == 0 && S_ISREG(st.st_mode)))) {
+ if ((mc->m.mnt_opts && strstr(mc->m.mnt_opts, "loop=")) ||
+ (stat(mc->m.mnt_fsname, &st) == 0 && S_ISREG(st.st_mode))) {
char *p = get_option_value(mc->m.mnt_opts, "offset=");
uintmax_t offset = 0;
diff --git a/mount/mount_mntent.c b/mount/mount_mntent.c
index d90def3..f42c0ad 100644
--- a/mount/mount_mntent.c
+++ b/mount/mount_mntent.c
@@ -70,7 +70,7 @@ my_addmntent (mntFILE *mfp, struct my_mntent *mnt) {
m1 = mangle(mnt->mnt_fsname);
m2 = mangle(mnt->mnt_dir);
m3 = mangle(mnt->mnt_type);
- m4 = mangle(mnt->mnt_opts);
+ m4 = mnt->mnt_opts ? mangle(mnt->mnt_opts) : "rw";
res = fprintf (mfp->mntent_fp, "%s %s %s %s %d %d\n",
m1, m2, m3, m4, mnt->mnt_freq, mnt->mnt_passno);
@@ -78,7 +78,8 @@ my_addmntent (mntFILE *mfp, struct my_mntent *mnt) {
free(m1);
free(m2);
free(m3);
- free(m4);
+ if (mnt->mnt_opts)
+ free(m4);
return (res < 0) ? 1 : 0;
}
diff --git a/mount/sundries.c b/mount/sundries.c
index ae4501a..2dec37f 100644
--- a/mount/sundries.c
+++ b/mount/sundries.c
@@ -217,6 +217,8 @@ matching_opts (const char *options, const char *test_opts) {
if (test_opts == NULL)
return 1;
+ if (options == NULL)
+ options = "";
len = strlen(test_opts);
q = alloca(len+1);
--
1.7.6

View File

@ -0,0 +1,92 @@
https://bugs.gentoo.org/370051
From b3b0c657818aa6191e6494f88d671601dd9d837d Mon Sep 17 00:00:00 2001
From: Petr Uzel <petr.uzel@suse.cz>
Date: Wed, 29 Jun 2011 10:24:09 +0200
Subject: [PATCH] umount: do not hang with disconnected NFS mounts
Since util-linux commit f4612577c942a3683b97632ad0b49671897c2070,
umount stat(2)s its argument to check whether it can be associated
with some loop device. This could hang with broken NFS mounts.
Fix by first checking mtab if umount's argument is mounted and only if
we fail, check if there is a loop device associated.
http://marc.info/?l=util-linux-ng&m=130924963804836&w=2
Reported-by: Konstantin Khlebnikov <khlebnikov@openvz.org>
Signed-off-by: Petr Uzel <petr.uzel@suse.cz>
---
mount/umount.c | 42 ++++++++++++++++++++++--------------------
1 files changed, 22 insertions(+), 20 deletions(-)
diff --git a/mount/umount.c b/mount/umount.c
index 0349cb3..96c940e 100644
--- a/mount/umount.c
+++ b/mount/umount.c
@@ -600,6 +600,7 @@ umount_file (char *arg) {
int fstab_has_user, fstab_has_users, fstab_has_owner, fstab_has_group;
int ok, status = 0;
struct stat statbuf;
+ char *loopdev = NULL;
if (!*arg) { /* "" would be expanded to `pwd` */
die(2, _("Cannot unmount \"\"\n"));
@@ -608,26 +609,7 @@ umount_file (char *arg) {
file = canonicalize(arg); /* mtab paths are canonicalized */
- /* if file is a regular file, check if it is associated
- * with some loop device
- */
- if (!stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
- char *loopdev = NULL;
- switch (find_loopdev_by_backing_file(file, &loopdev)) {
- case 0:
- if (verbose)
- printf(_("%s is associated with %s, trying to unmount it\n"),
- arg, loopdev);
- file = loopdev;
- break;
- case 2:
- if (verbose)
- printf(_("%s is associated with more than one loop device: not unmounting\n"),
- arg);
- break;
- }
- }
-
+try_loopdev:
if (verbose > 1)
printf(_("Trying to unmount %s\n"), file);
@@ -659,6 +641,26 @@ umount_file (char *arg) {
if (!mc && verbose)
printf(_("Could not find %s in mtab\n"), file);
+ /* not found in mtab - check if it is associated with some loop device
+ * (only if it is a regular file)
+ */
+ if (!mc && !loopdev && !stat(file, &statbuf) && S_ISREG(statbuf.st_mode)) {
+ switch (find_loopdev_by_backing_file(file, &loopdev)) {
+ case 0:
+ if (verbose)
+ printf(_("%s is associated with %s\n"),
+ arg, loopdev);
+ file = loopdev;
+ goto try_loopdev;
+ break;
+ case 2:
+ if (verbose)
+ printf(_("%s is associated with more than one loop device: not unmounting\n"),
+ arg);
+ break;
+ }
+ }
+
if (restricted) {
char *mtab_user = NULL;
--
1.7.6

View File

@ -0,0 +1,121 @@
# Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/sys-apps/util-linux/util-linux-2.19.1-r1.ebuild,v 1.10 2011/11/17 18:48:41 phajdan.jr Exp $
EAPI="3"
EGIT_REPO_URI="git://git.kernel.org/pub/scm/utils/util-linux/util-linux.git"
inherit eutils toolchain-funcs libtool flag-o-matic
[[ ${PV} == "9999" ]] && inherit git autotools
MY_PV=${PV/_/-}
MY_P=${PN}-${MY_PV}
S=${WORKDIR}/${MY_P}
DESCRIPTION="Various useful Linux utilities"
HOMEPAGE="http://www.kernel.org/pub/linux/utils/util-linux/"
if [[ ${PV} == "9999" ]] ; then
SRC_URI=""
#KEYWORDS=""
else
SRC_URI="mirror://kernel/linux/utils/util-linux/v${PV:0:4}/${MY_P}.tar.bz2
loop-aes? ( http://loop-aes.sourceforge.net/updates/util-linux-2.19.1-20110510.diff.bz2 )"
KEYWORDS="alpha amd64 arm hppa ia64 m68k ~mips ppc ~ppc64 s390 sh sparc x86 ~x86-linux"
fi
LICENSE="GPL-2"
SLOT="0"
IUSE="+cramfs crypt loop-aes ncurses nls old-linux perl selinux slang uclibc unicode"
RDEPEND="!sys-process/schedutils
!sys-apps/setarch
!<sys-libs/e2fsprogs-libs-1.41.8
!<sys-fs/e2fsprogs-1.41.8
cramfs? ( sys-libs/zlib )
ncurses? ( >=sys-libs/ncurses-5.2-r2 )
perl? ( dev-lang/perl )
selinux? ( sys-libs/libselinux )
slang? ( sys-libs/slang )"
DEPEND="${RDEPEND}
nls? ( sys-devel/gettext )
virtual/os-headers"
src_prepare() {
if [[ ${PV} == "9999" ]] ; then
autopoint --force
eautoreconf
else
use loop-aes && epatch "${WORKDIR}"/util-linux-*.diff
fi
epatch "${FILESDIR}"/${P}-mount-a-segv.patch #366213
if ! use loop-aes ; then
epatch "${FILESDIR}"/${P}-umount-l-nfs.patch #370051
else
ewarn "loop-aes is incompatible with current solution of #370051 bug!"
ewarn "Therefore you're vulnerable to that bug now!"
ewarn "Look at https://bugs.gentoo.org/show_bug.cgi?id=370051."
fi
use uclibc && sed -i -e s/versionsort/alphasort/g -e s/strverscmp.h/dirent.h/g mount/lomount.c
elibtoolize
}
lfs_fallocate_test() {
# Make sure we can use fallocate with LFS #300307
cat <<-EOF > "${T}"/fallocate.c
#define _GNU_SOURCE
#include <fcntl.h>
main() { return fallocate(0, 0, 0, 0); }
EOF
append-lfs-flags
$(tc-getCC) ${CFLAGS} ${CPPFLAGS} ${LDFLAGS} "${T}"/fallocate.c -o /dev/null >/dev/null 2>&1 \
|| export ac_cv_func_fallocate=no
rm -f "${T}"/fallocate.c
}
usex() { use $1 && echo ${2:-yes} || echo ${3:-no} ; }
src_configure() {
lfs_fallocate_test
econf \
--enable-fs-paths-extra=/usr/sbin \
$(use_enable nls) \
--enable-agetty \
$(use_enable cramfs) \
$(use_enable old-linux elvtune) \
--with-ncurses=$(usex ncurses $(usex unicode auto yes) no) \
--disable-init \
--disable-kill \
--disable-last \
--disable-mesg \
--enable-partx \
--enable-raw \
--enable-rename \
--disable-reset \
--disable-login-utils \
--enable-schedutils \
--disable-wall \
--enable-write \
--without-pam \
$(use_with selinux) \
$(use_with slang) \
$(tc-has-tls || echo --disable-tls)
}
src_install() {
emake install DESTDIR="${D}" || die "install failed"
dodoc AUTHORS NEWS README* TODO docs/*
if ! use perl ; then #284093
rm "${ED}"/usr/bin/chkdupexe || die
rm "${ED}"/usr/share/man/man1/chkdupexe.1 || die
fi
# need the libs in /
gen_usr_ldscript -a blkid uuid
# e2fsprogs-libs didnt install .la files, and .pc work fine
rm -f "${ED}"/usr/$(get_libdir)/*.la
if use crypt ; then
newinitd "${FILESDIR}"/crypto-loop.initd crypto-loop || die
newconfd "${FILESDIR}"/crypto-loop.confd crypto-loop || die
fi
}