Hello !

Richard Thrippleton wrote:
> Running "pmount -d /dev/cdrom" just hangs - no debugging output. Doing the 
> same
> with strace enabled (and running as root - strace clobbers setuid) -

  It is quite fortunate that strace clobbers setuid (or rather that it
wouldn't work to run it with setuid) - else any setuid program could be
used to run arbitrary code with root permissions ;-)...

> getcwd("/root", 4096)                   = 6
> lstat64("/root/none", 0xbf98b89c)       = -1 ENOENT (No such file or 
> directory)
> lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
> lstat64("/mnt", {st_mode=S_IFDIR|0700, st_size=4096, ...}) = 0
> lstat64("/mnt/bulk",  <unfinished ...>

 OK, I got the problem: pmount checks whether the given argument is a
/etc/fstab mountpoint. If it is a good idea, it is stupid to do so when
the argument is a block device. Are you comfortable with applying
patches ? I've attached a patch that should fix the symptoms - at least,
it removes the accesses to the mountpoints in /etc/fstab when the
argument to pmount is a full device name.

  If you are not comfortable with patches, I can make a .deb binary (but
only for i386 or amd64), just ask.

  Thanks for your quick answer. Regards,

        Vincent Fourmond


-- 
Vincent Fourmond, Debian Developer
http://vincent.fourmond.neuf.fr/
-- pretty boring signature, isn't it ?
=== modified file 'src/pmount.c'
--- src/pmount.c	2007-07-03 00:16:38 +0000
+++ src/pmount.c	2007-07-07 07:06:40 +0000
@@ -669,8 +669,11 @@
         return E_ARGS;
     }
 
-    /* if we got a mount point, convert it to a device */
-    if( fstab_has_mntpt( "/etc/fstab", devarg, mntptdev, sizeof(mntptdev) ) ) {
+    /* Lookup in /etc/fstab if devarg is a mount point, unless we already
+       have a block device -- this way, pmount shouldn't choke on stale
+       network mounts. */
+    if( (! is_block(devarg)) && 
+	fstab_has_mntpt( "/etc/fstab", devarg, mntptdev, sizeof(mntptdev) ) ) {
         debug( "resolved mount point %s to device %s\n", devarg, mntptdev );
         devarg = mntptdev;
     }

=== modified file 'src/utils.c'
--- src/utils.c	2005-10-13 15:16:44 +0000
+++ src/utils.c	2007-07-07 07:04:36 +0000
@@ -179,6 +179,18 @@
 }
 
 int
+is_block( const char* path )
+{
+    struct stat st;
+
+    if( stat( path, &st ) )
+        return 0;
+
+    return S_ISBLK( st.st_mode );
+}
+
+
+int
 remove_pmount_mntpt( const char *path ) 
 {
     char stampfile[PATH_MAX];

=== modified file 'src/utils.h'
--- src/utils.h	2005-10-05 11:49:57 +0000
+++ src/utils.h	2007-07-07 07:05:06 +0000
@@ -47,6 +47,13 @@
 int is_dir( const char* path );
 
 /**
+ * Return whether given path is a block device.
+ @ return 1 = block device, 0 = no block device
+ */
+int is_block( const char* path );
+
+
+/**
  * Remove a mountpoint created by pmount (i. e. only if the directory contains
  * a stamp file).
  * @return 0 on success, -1 on error

Reply via email to