From 8a9d3be9eac60f083c031d71cb6d72119c02545356ba4dc37bcc470f02589f1b Mon Sep 17 00:00:00 2001 From: OBS User unknown Date: Thu, 1 Mar 2007 20:08:53 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/util-linux?expand=0&rev=4 --- util-linux-2.12r-losetup_password.patch | 28 +++++++--- util-linux-2.12r-mount_racy_loop.patch | 70 +++++++++++++++++++++++++ util-linux.changes | 7 +++ util-linux.spec | 10 +++- 4 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 util-linux-2.12r-mount_racy_loop.patch diff --git a/util-linux-2.12r-losetup_password.patch b/util-linux-2.12r-losetup_password.patch index 8098f68..2eea2b4 100644 --- a/util-linux-2.12r-losetup_password.patch +++ b/util-linux-2.12r-losetup_password.patch @@ -159,7 +159,15 @@ Index: util-linux-2.12r/mount/lomount.c loopFileName = (char *)file; multiKeyMode = 0; -@@ -848,8 +872,8 @@ set_loop(const char *device, const char +@@ -802,6 +826,7 @@ set_loop(const char *device, const char + } + if ((fd = open(device, mode)) < 0) { + perror (device); ++ ret = 1; + goto close_ffd_return1; + } + *loopro = (mode == O_RDONLY); +@@ -848,8 +873,8 @@ set_loop(const char *device, const char loopinfo.lo_encrypt_key_size = 0; break; case LO_CRYPT_XOR: @@ -170,7 +178,7 @@ Index: util-linux-2.12r/mount/lomount.c xstrncpy (loopinfo.lo_encrypt_key, pass, LO_KEY_SIZE); loopinfo.lo_encrypt_key_size = strlen(loopinfo.lo_encrypt_key); break; -@@ -886,6 +910,7 @@ set_loop(const char *device, const char +@@ -886,6 +911,7 @@ set_loop(const char *device, const char /* This is not compatible with gpgkey= mount option */ if(rd_wr_retry(atoi(passFDnumber), (char *)&loopinfo.lo_encrypt_key[0], LO_KEY_SIZE, 0) < 1) { fprintf(stderr, _("Error: couldn't read binary key\n")); @@ -178,7 +186,7 @@ Index: util-linux-2.12r/mount/lomount.c goto close_fd_ffd_return1; } break; /* out of switch(loopinfo.lo_encrypt_type) */ -@@ -894,6 +919,7 @@ set_loop(const char *device, const char +@@ -894,6 +920,7 @@ set_loop(const char *device, const char /* WARNING! DO NOT USE RANDOM HASH TYPE ON PARTITION WITH EXISTING */ /* IMPORTANT DATA ON IT. RANDOM HASH TYPE WILL DESTROY YOUR DATA. */ if(loop_create_random_keys((char*)file, *loopro, &multiKeyBits[0][0])) { @@ -186,7 +194,7 @@ Index: util-linux-2.12r/mount/lomount.c goto close_fd_ffd_return1; } memcpy(&loopinfo.lo_encrypt_key[0], &multiKeyBits[0][0], sizeof(loopinfo.lo_encrypt_key)); -@@ -901,8 +927,8 @@ set_loop(const char *device, const char +@@ -901,8 +928,8 @@ set_loop(const char *device, const char break; /* out of switch(loopinfo.lo_encrypt_type) */ } } @@ -197,7 +205,7 @@ Index: util-linux-2.12r/mount/lomount.c i = strlen(pass); if(hashFunc == unhashed1_key_setup) { /* this is for compatibility with historic loop-AES version */ -@@ -966,6 +992,7 @@ set_loop(const char *device, const char +@@ -966,6 +993,7 @@ set_loop(const char *device, const char break; default: fprintf (stderr, _("Error: don't know how to get key for encryption system %d\n"), loopinfo.lo_encrypt_type); @@ -205,7 +213,7 @@ Index: util-linux-2.12r/mount/lomount.c goto close_fd_ffd_return1; } -@@ -985,7 +1012,7 @@ close_fd_ffd_return1: +@@ -985,7 +1013,7 @@ close_fd_ffd_return1: close (fd); close_ffd_return1: close (ffd); @@ -214,6 +222,14 @@ Index: util-linux-2.12r/mount/lomount.c } /* type 18 == LO_CRYPT_CRYPTOAPI */ +@@ -995,6 +1023,7 @@ close_ffd_return1: + fprintf(stderr, _("ioctl: LOOP_SET_STATUS: %s, requested cipher or key length (%d bits) not supported by kernel\n"), strerror(errno), loopinfo.lo_encrypt_key_size << 3); + loop_clr_fd_out: + (void) ioctl (fd, LOOP_CLR_FD, 0); ++ ret = 1; + goto keyclean_close_fd_ffd_return1; + } + } Index: util-linux-2.12r/mount/losetup.8 =================================================================== --- util-linux-2.12r.orig/mount/losetup.8 diff --git a/util-linux-2.12r-mount_racy_loop.patch b/util-linux-2.12r-mount_racy_loop.patch new file mode 100644 index 0000000..cba877a --- /dev/null +++ b/util-linux-2.12r-mount_racy_loop.patch @@ -0,0 +1,70 @@ +Index: util-linux-2.12r/mount/lomount.c +=================================================================== +--- util-linux-2.12r.orig/mount/lomount.c ++++ util-linux-2.12r/mount/lomount.c +@@ -1005,7 +1005,17 @@ set_loop(const char *device, const char + } + + if (ioctl(fd, LOOP_SET_FD, ffd) < 0) { +- perror("ioctl: LOOP_SET_FD"); ++ switch (errno) { ++ case EBUSY: ++ ret = 2; ++ if (verbose) ++ perror("ioctl: LOOP_SET_FD"); ++ break; ++ default: ++ ret = 1; ++ perror("ioctl: LOOP_SET_FD"); ++ break; ++ } + keyclean_close_fd_ffd_return1: + memset(loopinfo.lo_encrypt_key, 0, sizeof(loopinfo.lo_encrypt_key)); + memset(&multiKeyBits[0][0], 0, sizeof(multiKeyBits)); +Index: util-linux-2.12r/mount/mount.c +=================================================================== +--- util-linux-2.12r.orig/mount/mount.c ++++ util-linux-2.12r/mount/mount.c +@@ -653,18 +653,32 @@ loop_check(const char **spec, const char + printf(_("mount: skipping the setup of a loop device\n")); + } else { + int loopro = (*flags & MS_RDONLY); ++ int res; + +- if (!*loopdev || !**loopdev) +- *loopdev = find_unused_loop_device(); +- if (!*loopdev) +- return EX_SYSERR; /* no more loop devices */ +- if (verbose) +- printf(_("mount: going to use the loop device %s\n"), *loopdev); +- if (set_loop (*loopdev, *loopfile, &loopro, type, AutoChmodPtr)) { ++ do { ++ if (!*loopdev || !**loopdev) ++ *loopdev = find_unused_loop_device(); ++ if (!*loopdev) ++ return EX_SYSERR; /* no more loop devices */ + if (verbose) +- printf(_("mount: failed setting up loop device\n")); +- return EX_FAIL; +- } ++ printf(_("mount: going to use the loop device %s\n"), *loopdev); ++ if (res = set_loop (*loopdev, *loopfile, &loopro, type, AutoChmodPtr)) { ++ switch(res) { ++ case 2: ++ /* loop dev has been grabbed by some other process, ++ try again */ ++ if (verbose) ++ printf("mount: stolen loop=%s ...trying again\n", *loopdev); ++ *loopdev = NULL; ++ continue; ++ default: ++ if (verbose) ++ printf(_("mount: failed setting up loop device\n")); ++ return EX_FAIL; ++ } ++ } ++ } while (!*loopdev); ++ + if (verbose > 1) + printf(_("mount: setup loop device successfully\n")); + *spec = *loopdev; diff --git a/util-linux.changes b/util-linux.changes index a388eb5..d778b78 100644 --- a/util-linux.changes +++ b/util-linux.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Tue Feb 27 10:58:46 CET 2007 - mkoenig@suse.de + +- fix missing return code in + util-linux-2.12r-losetup_password.patch +- mount: fix race condition in mount -o loop [#242750] + ------------------------------------------------------------------- Mon Feb 12 17:22:45 CET 2007 - mkoenig@suse.de diff --git a/util-linux.spec b/util-linux.spec index 88a8e90..3e76241 100644 --- a/util-linux.spec +++ b/util-linux.spec @@ -20,7 +20,7 @@ License: BSD License and BSD-like, GNU General Public License (GPL) Group: System/Base Autoreqprov: on Version: 2.12r -Release: 73 +Release: 76 Summary: A collection of basic system utilities Source: ftp://ftp.kernel.org/pub/linux/utils/util-linux/%name-%version.tar.bz2 Source2: nologin.c @@ -110,6 +110,7 @@ Patch108: util-linux-2.12r-nfs_remount_options.patch Patch109: util-linux-2.12r-losetup_password.patch Patch110: util-linux-2.12r-mkfs_open_exclusive.patch Patch111: util-linux-2.12r-fdisk_remove_bogus_warnings.patch +Patch112: util-linux-2.12r-mount_racy_loop.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build PreReq: %insserv_prereq %fillup_prereq /bin/sed @@ -185,6 +186,7 @@ cd - %patch109 -p1 %patch110 -p1 %patch111 -p1 +%patch112 -p1 # setctsid cp %{S:22} %{S:23} . # nologin and guessfstype @@ -617,7 +619,11 @@ fi %{_mandir}/man8/tunelp.8.gz %endif -%changelog -n util-linux +%changelog +* Tue Feb 27 2007 - mkoenig@suse.de +- fix missing return code in + util-linux-2.12r-losetup_password.patch +- mount: fix race condition in mount -o loop [#242750] * Mon Feb 12 2007 - mkoenig@suse.de - remove legacy warnings from fdisk [#241372] * Fri Feb 02 2007 - mkoenig@suse.de