hfsplus: emit proper file type from readdir
hfsplus_readdir() incorrectly returned DT_REG for symbolic links and special files. Return DT_REG, DT_LNK, DT_FIFO, DT_CHR, DT_BLK, DT_SOCK, or DT_UNKNOWN according to mode field in catalog record. Programs relying on information from readdir will now work correctly with HFS+. Signed-off-by: Sergei Antonov <saproj@gmail.com> Cc: Anton Altaparmakov <aia21@cam.ac.uk> Cc: Al Viro <viro@zeniv.linux.org.uk> Cc: Christoph Hellwig <hch@infradead.org> Cc: Vyacheslav Dubeyko <slava@dubeyko.com> Cc: Hin-Tak Leung <htl10@users.sourceforge.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
7f2fc81ea2
commit
97a62eaefd
|
@ -218,13 +218,31 @@ static int hfsplus_readdir(struct file *file, struct dir_context *ctx)
|
|||
be32_to_cpu(entry.folder.id), DT_DIR))
|
||||
break;
|
||||
} else if (type == HFSPLUS_FILE) {
|
||||
u16 mode;
|
||||
unsigned type = DT_UNKNOWN;
|
||||
|
||||
if (fd.entrylength < sizeof(struct hfsplus_cat_file)) {
|
||||
pr_err("small file entry\n");
|
||||
err = -EIO;
|
||||
goto out;
|
||||
}
|
||||
|
||||
mode = be16_to_cpu(entry.file.permissions.mode);
|
||||
if (S_ISREG(mode))
|
||||
type = DT_REG;
|
||||
else if (S_ISLNK(mode))
|
||||
type = DT_LNK;
|
||||
else if (S_ISFIFO(mode))
|
||||
type = DT_FIFO;
|
||||
else if (S_ISCHR(mode))
|
||||
type = DT_CHR;
|
||||
else if (S_ISBLK(mode))
|
||||
type = DT_BLK;
|
||||
else if (S_ISSOCK(mode))
|
||||
type = DT_SOCK;
|
||||
|
||||
if (!dir_emit(ctx, strbuf, len,
|
||||
be32_to_cpu(entry.file.id), DT_REG))
|
||||
be32_to_cpu(entry.file.id), type))
|
||||
break;
|
||||
} else {
|
||||
pr_err("bad catalog entry type\n");
|
||||
|
|
Loading…
Reference in a new issue