fs: btrfs: inode: handle uninitialized type before returning it
In btrfs_lookup_path() the local variable @type should always be updated after we hit any file/dir. But if @filename is NULL from the very beginning, then we don't initialize it and return it directly. To prevent such problem from happening, we initialize @type to BTRFS_FT_UNKNOWN. For normal execution route, it will get updated for each filename we resolved. Buf if we didn't find any path, we check if the type is still FT_UNKNOWN and ret == 0. If true we know there is something wrong, just return -EUCLEAN to inform the caller. Reported-by: Coverity CID 312958 Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: Marek Behún <marek.behun@nic.cz>
This commit is contained in:
parent
c49b0eb034
commit
9b5546c37a
@ -251,7 +251,7 @@ int btrfs_lookup_path(struct btrfs_root *root, u64 ino, const char *filename,
|
|||||||
const char *cur = filename;
|
const char *cur = filename;
|
||||||
u64 next_ino;
|
u64 next_ino;
|
||||||
u8 next_type;
|
u8 next_type;
|
||||||
u8 type;
|
u8 type = BTRFS_FT_UNKNOWN;
|
||||||
int len;
|
int len;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
@ -335,6 +335,10 @@ next:
|
|||||||
cur += len;
|
cur += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* We haven't found anything, but still get no error? */
|
||||||
|
if (type == BTRFS_FT_UNKNOWN && !ret)
|
||||||
|
ret = -EUCLEAN;
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
*root_ret = root;
|
*root_ret = root;
|
||||||
*ino_ret = ino;
|
*ino_ret = ino;
|
||||||
|
Loading…
Reference in New Issue
Block a user