tags 305765 +patch
thanks

Hi Eduard,

On Fri, Apr 22, 2005 at 03:13:33AM +0200, Eduard Bloch wrote:
> when I try to umount a partition mounted by the same user before, the
> operation fails and I get a segmentation fault. On partitions mounted by
> root, there is a proper message:
> 
> $ umount /mnt/c
> umount: only root can unmount /dev/hda1 from /mnt/c
> $ umount /mnt/d 
> Segmentation fault
> $ mount
> ...
> /dev/hda1 /mnt/c vfat 
> rw,nodiratime,nosuid,nodev,noexec,fmask=0000,dmask=0000,codepage=cp437,iocharset=utf8,utf8
>  0 0
> /dev/sda1 /mnt/d vfat 
> rw,nodiratime,nosuid,nodev,noexec,uid=1000,gid=1000,fmask=0000,dmask=0000,codepage=cp437,iocharset=utf8,utf8
>  0 0
> $ cat /etc/fstab
> ...
> /dev/hda1       /mnt/c          vfat    auto,user,umask=000,utf8        0     
>   0
> UUID="41EB-F193"       /mnt/d          vfat    auto,user,umask=000,utf8       
>  0       0
> 
> This looks odd, I cannot see the reasons for a) not allowing the umount and b)
> the segmentation fault.

For b), there are a couple of different issues at play.

The segfault happens in has_uuid(), when mount_get_devname_by_uuid()
returns NULL and umount then tries dereferencing that. Attached patch
has_uuid_segv.diff should address that.

Next thing, has_uuid() passes the device as argument to ..by_uuid().
That obviously fails, since there is no UUID of "/dev/sda1" :-) Attached
patch has_uuid_uuid.diff changes it to really pass the uuid as expected.

Still doesn't work? The uuid passed to has_uuid() includes the double
quotes around the uuid if configured like in your fstab. If you remove
those quotes, umount should now happily umount the correct device.

cheers,
Max
--- mount/fstab.c~      2005-04-22 14:21:16.730370176 +0200
+++ mount/fstab.c       2005-04-22 14:21:57.685144104 +0200
@@ -294,9 +294,12 @@
 static int
 has_uuid(const char *device, const char *uuid){
        const char *devuuid;
-       int ret;
+       int ret = 0;
 
        devuuid = mount_get_devname_by_uuid(device);
+        if (!devuuid)
+            return ret;
+
        ret = !strcmp(uuid, devuuid);
        /* free(devuuid); */
        return ret;
--- mount/fstab.c~      2005-04-22 14:31:51.975301216 +0200
+++ mount/fstab.c       2005-04-22 14:32:12.104241152 +0200
@@ -293,14 +293,14 @@
 
 static int
 has_uuid(const char *device, const char *uuid){
-       const char *devuuid;
+       const char *devname;
        int ret = 0;
 
-       devuuid = mount_get_devname_by_uuid(device);
-        if (!devuuid)
+       devname = mount_get_devname_by_uuid(uuid);
+        if (!devname)
             return ret;
 
-       ret = !strcmp(uuid, devuuid);
+       ret = !strcmp(device, devname);
        /* free(devuuid); */
        return ret;
 }

Reply via email to