diff options
author | Wang Shilong <wangsl.fnst@cn.fujitsu.com> | 2013-12-12 15:46:18 +0800 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2014-01-31 08:22:14 -0800 |
commit | 80d5bf799e730d63ba52243857de43fc4aca6c75 (patch) | |
tree | 8d8a91cd3b189e557882636253f4bcce41358f20 | |
parent | d9d970451024709bdff71bf20b99843a132c195d (diff) |
Btrfs-progs: make sure we are opening a file or dir with open_file_or_dir()
Previously, open_file_or_dir() will open block device successfully, however,
we should enhance such checks to make sure we are really opening a file or dir.
Signed-off-by: Wang Shilong <wangsl.fnst@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r-- | utils.c | 13 |
1 files changed, 10 insertions, 3 deletions
@@ -1571,13 +1571,20 @@ int open_file_or_dir(const char *fname, DIR **dirstream) if (S_ISDIR(st.st_mode)) { *dirstream = opendir(fname); if (!*dirstream) - return -2; + return -1; fd = dirfd(*dirstream); - } else { + } else if (S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) { fd = open(fname, O_RDWR); + } else { + /* + * we set this on purpose, in case the caller output + * strerror(errno) as success + */ + errno = EINVAL; + return -1; } if (fd < 0) { - fd = -3; + fd = -1; if (*dirstream) closedir(*dirstream); } |