@@ -59,6 +59,7 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str
{
struct inode * inode;
ino_t ino;
+ struct dentry *ret;
if (dentry->d_name.len > EXT2_NAME_LEN)
return ERR_PTR(-ENAMETOOLONG);
@@ -74,7 +75,13 @@ static struct dentry *ext2_lookup(struct inode * dir, struct dentry *dentry, str
return ERR_PTR(-EIO);
}
}
- return d_splice_alias(inode, dentry);
+ ret = d_splice_alias(inode, dentry);
+ if (IS_ERR(ret)) {
+ ext2_error(dir->i_sb, __func__, "directory #%lu corrupted",
+ dir->i_ino);
+ iput(inode);
+ }
+ return ret;
}
struct dentry *ext2_get_parent(struct dentry *child)
When directory hiearchy is corrupted and contains cycles, d_splice_alias() can fail. Handle the failure cleanly. Signed-off-by: Jan Kara <jack@suse.cz> --- fs/ext2/namei.c | 9 ++++++++- 1 files changed, 8 insertions(+), 1 deletions(-)