summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWang Shilong <wangsl.fnst@cn.fujitsu.com>2013-12-12 15:46:18 +0800
committerChris Mason <clm@fb.com>2014-01-31 08:22:14 -0800
commit80d5bf799e730d63ba52243857de43fc4aca6c75 (patch)
tree8d8a91cd3b189e557882636253f4bcce41358f20
parentd9d970451024709bdff71bf20b99843a132c195d (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.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/utils.c b/utils.c
index c1c55db4..9fd8710e 100644
--- a/utils.c
+++ b/utils.c
@@ -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);
}