linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / fs / vfat / namei.c
index 9a8f48b..ef46939 100644 (file)
@@ -185,6 +185,24 @@ static int vfat_valid_longname(const unsigned char *name, unsigned int len)
                return -EINVAL;
        if (len >= 256)
                return -ENAMETOOLONG;
+
+       /* MS-DOS "device special files" */
+       if (len == 3 || (len > 3 && name[3] == '.')) {  /* basename == 3 */
+               if (!strnicmp(name, "aux", 3) ||
+                   !strnicmp(name, "con", 3) ||
+                   !strnicmp(name, "nul", 3) ||
+                   !strnicmp(name, "prn", 3))
+                       return -EINVAL;
+       }
+       if (len == 4 || (len > 4 && name[4] == '.')) {  /* basename == 4 */
+               /* "com1", "com2", ... */
+               if ('1' <= name[3] && name[3] <= '9') {
+                       if (!strnicmp(name, "com", 3) ||
+                           !strnicmp(name, "lpt", 3))
+                               return -EINVAL;
+               }
+       }
+
        return 0;
 }
 
@@ -1023,12 +1041,11 @@ static int vfat_fill_super(struct super_block *sb, void *data, int silent)
        return 0;
 }
 
-static int vfat_get_sb(struct file_system_type *fs_type,
-                      int flags, const char *dev_name,
-                      void *data, struct vfsmount *mnt)
+static struct super_block *vfat_get_sb(struct file_system_type *fs_type,
+                                      int flags, const char *dev_name,
+                                      void *data)
 {
-       return get_sb_bdev(fs_type, flags, dev_name, data, vfat_fill_super,
-                          mnt);
+       return get_sb_bdev(fs_type, flags, dev_name, data, vfat_fill_super);
 }
 
 static struct file_system_type vfat_fs_type = {