diff options
Diffstat (limited to 'fs/fat/dir.c')
-rw-r--r-- | fs/fat/dir.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/fs/fat/dir.c b/fs/fat/dir.c index 971e369517a7..0bbe89a7ebc3 100644 --- a/fs/fat/dir.c +++ b/fs/fat/dir.c @@ -368,7 +368,8 @@ static int fat_parse_short(struct super_block *sb, dotoffset = 1; } - memcpy(work, de->name, sizeof(work)); + memcpy(work, de->name, sizeof(de->name)); + /* see namei.c, msdos_format_name */ if (work[0] == 0x05) work[0] = 0xE5; @@ -498,6 +499,13 @@ parse_record: goto end_of_dir; } + /* + * The FAT_NO_83NAME flag is used to mark files + * created with no 8.3 short name + */ + if (de->lcase & FAT_NO_83NAME) + goto compare_longname; + /* Never prepend '.' to hidden files here. * That is done only for msdos mounts (and only when * 'dotsOK=yes'); if we are executing here, it is in the @@ -511,6 +519,7 @@ parse_record: if (fat_name_match(sbi, name, name_len, bufname, len)) goto found; +compare_longname: if (nr_slots) { void *longname = unicode + FAT_MAX_UNI_CHARS; int size = PATH_MAX - FAT_MAX_UNI_SIZE; @@ -602,6 +611,8 @@ parse_record: if (de->attr != ATTR_EXT && IS_FREE(de->name)) goto record_end; } else { + if (de->lcase & FAT_NO_83NAME) + goto record_end; if ((de->attr & ATTR_VOLUME) || IS_FREE(de->name)) goto record_end; } @@ -960,6 +971,10 @@ int fat_scan(struct inode *dir, const unsigned char *name, sinfo->bh = NULL; while (fat_get_short_entry(dir, &sinfo->slot_off, &sinfo->bh, &sinfo->de) >= 0) { + /* skip files marked as having no 8.3 short name */ + if (sinfo->de->lcase & FAT_NO_83NAME) + continue; + if (!strncmp(sinfo->de->name, name, MSDOS_NAME)) { sinfo->slot_off -= sizeof(*sinfo->de); sinfo->nr_slots = 1; |