tilde-bug in vfs.c

Oskar Liljeblad oskar at osk.mine.nu
Thu Sep 5 19:40:58 UTC 2002


Hello

There is a bug which makes mc display regular file named '~root'
(or '~<someaccount>') as a directory. It is mentioned at

  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=66591&repeatmerged=yes
  http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=61202&repeatmerged=yes

The problem is in vfs_canon in vfs/vfs.c. This patch is a bit
crude, but it works. I don't know of a better solution unless you
intend to replace all calls of vfs_canon with something else.

Oskar Liljeblad (oskar at osk.mine.nu)

PS. There's no bug tracker for MC right? DS.
-------------- next part --------------
--- vfs/vfs.c.orig	2002-09-05 21:02:47.000000000 +0200
+++ vfs/vfs.c	2002-09-05 21:18:51.000000000 +0200
@@ -720,31 +720,31 @@
 
 #define ISSLASH(a) (!a || (a == '/'))
 
-char *
-vfs_canon (const char *path)
+static char *
+vfs_canon_internal (const char *path, int allow_tilde)
 {
     if (!path)
 	vfs_die("Cannot canonicalize NULL");
 
     /* Tilde expansion */
-    if (*path == '~'){ 
+    if (allow_tilde && *path == '~'){
     	char *local, *result;
 
     	local = tilde_expand (path);
 	if (local){
-	    result = vfs_canon (local);
+	    result = vfs_canon_internal (local, allow_tilde);
 	    g_free (local);
 	    return result;
 	}
     }
 
     /* Relative to current directory */
-    if (*path != PATH_SEP){ 
+    if (*path != PATH_SEP){
     	char *local, *result;
 
 	local = concat_dir_and_file (current_dir, path);
 
-	result = vfs_canon (local);
+	result = vfs_canon_internal (local, allow_tilde);
 	g_free (local);
 	return result;
     }
@@ -760,6 +760,24 @@
     }
 }
 
+char *
+vfs_canon (const char *path)
+{
+    char *canon;
+    vfs *vfs;
+    struct stat buf;
+
+    canon = vfs_canon_internal(path, 0);
+    
+    vfs = vfs_type (canon);
+    if (vfs->stat && (*vfs->stat) (vfs, vfs_name (canon), &buf) != -1){
+    	return canon;
+    }
+    g_free (canon);
+
+    return vfs_canon_internal(path, 1);
+}
+
 vfsid
 vfs_ncs_getid (vfs *nvfs, char *dir, struct vfs_stamping **par)
 {


More information about the mc-devel mailing list