summaryrefslogtreecommitdiff
path: root/core/fs/fs.c
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2010-06-23 12:11:49 -0700
committerH. Peter Anvin <hpa@zytor.com>2010-06-23 12:11:49 -0700
commit3ee5120d0795b361c3548e9bb13cadf33802f73a (patch)
treefda95014f0c23eb55fba504012e9a1155bb6e901 /core/fs/fs.c
parentf91320f6834ad7f00ff827531780462965ac4acb (diff)
downloadsyslinux-3ee5120d0795b361c3548e9bb13cadf33802f73a.tar.gz
fs: enforce filetypes in open_file
Enforce that the file type in open_file is a plain file. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'core/fs/fs.c')
-rw-r--r--core/fs/fs.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/core/fs/fs.c b/core/fs/fs.c
index 3ae12ec9..c16f9550 100644
--- a/core/fs/fs.c
+++ b/core/fs/fs.c
@@ -330,12 +330,20 @@ int open_file(const char *name, struct com32_filedata *filedata)
mangle_name(mangled_name, name);
rv = searchdir(mangled_name);
- if (rv >= 0) {
- file = handle_to_file(rv);
- filedata->size = file->inode->size;
- filedata->blocklg2 = SECTOR_SHIFT(file->fs);
- filedata->handle = rv;
+ if (rv < 0)
+ return rv;
+
+ file = handle_to_file(rv);
+
+ if (file->inode->mode != DT_REG) {
+ _close_file(file);
+ return -1;
}
+
+ filedata->size = file->inode->size;
+ filedata->blocklg2 = SECTOR_SHIFT(file->fs);
+ filedata->handle = rv;
+
return rv;
}