X-Git-Url: http://git.onelab.eu/?p=linux-2.6.git;a=blobdiff_plain;f=fs%2Fvfat%2Fnamei.c;fp=fs%2Fvfat%2Fnamei.c;h=ef46939c0c1a9cdaf1fd643806d14bad77270743;hp=9a8f48bae95626b739b34867713fc2d7d367f649;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c diff --git a/fs/vfat/namei.c b/fs/vfat/namei.c index 9a8f48bae..ef46939c0 100644 --- a/fs/vfat/namei.c +++ b/fs/vfat/namei.c @@ -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 = {