~ubuntu-branches/ubuntu/lucid/util-linux/lucid-security

« back to all changes in this revision

Viewing changes to mount/umount.c

  • Committer: Bazaar Package Importer
  • Author(s): Marc Deslauriers
  • Date: 2010-12-03 15:30:33 UTC
  • Revision ID: james.westby@ubuntu.com-20101203153033-0mseuou9ilpsu846
Tags: 2.17.2-0ubuntu1.10.04.1
* SECURITY UPDATE: arbitrary unmount with fuse (LP: #670622)
  - This update adds support for new options required by the fuse
    security update.
  - mount/umount.{c,8}: Add --fake option to umount(8), which omits
    calling the actual umount syscall (and the loop device deletion) but
    modifies /etc/mtab.
    - http://git.kernel.org/?p=utils/util-linux-ng/util-linux-ng.git;a=commit;h=97a3cef4f1
  - mount/devname.c: "Spec" was still canonicalized despite
    --no-canonicalize.  This resulted in a hang during login with
    pam_encfs. (Debian Bug #593336)
  - http://git.kernel.org/?p=utils/util-linux-ng/util-linux-ng.git;a=commit;h=1cf4c20b19
  - CVE-2010-3879

Show diffs side-by-side

added added

removed removed

Lines of Context:
81
81
int complained_err = 0;
82
82
char *complained_dev = NULL;
83
83
 
 
84
/* True for fake umount (--fake).  */
 
85
static int fake = 0;
 
86
 
84
87
/*
85
88
 * check_special_umountprog()
86
89
 *      If there is a special umount program for this type, exec it.
187
190
            const char *opts, struct mntentchn *mc) {
188
191
        int umnt_err = 0;
189
192
        int isroot;
190
 
        int res;
 
193
        int res = 0;
191
194
        int status;
192
195
        const char *loopdev;
193
196
        int myloop = 0;
210
213
        if (check_special_umountprog(spec, node, type, &status))
211
214
                return status;
212
215
 
 
216
        /* Skip the actual umounting for --fake */
 
217
        if (fake)
 
218
                goto writemtab;
213
219
        /*
214
220
         * Ignore the option "-d" for non-loop devices and loop devices with
215
221
         * LO_FLAGS_AUTOCLEAR flag.
390
396
  { "types", 1, 0, 't' },
391
397
 
392
398
  { "no-canonicalize", 0, 0, 144 },
 
399
  { "fake", 0, 0, 145 },
393
400
  { NULL, 0, 0, 0 }
394
401
};
395
402
 
679
686
                case 144:
680
687
                        nocanonicalize = 1;
681
688
                        break;
 
689
                case 145:
 
690
                        fake = 1;
 
691
                        break;
682
692
                case 0:
683
693
                        break;
684
694
                case '?':
697
707
        }
698
708
 
699
709
        if (restricted &&
700
 
            (all || types || nomtab || force || remount || nocanonicalize)) {
 
710
            (all || types || nomtab || force || remount || nocanonicalize ||
 
711
             fake)) {
701
712
                die (2, _("umount: only root can do that"));
702
713
        }
703
714