hpfs: fix an inode leak in lookup, switch to d_splice_alias()
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -244,6 +244,7 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, unsigned in
|
|||||||
result = iget_locked(dir->i_sb, ino);
|
result = iget_locked(dir->i_sb, ino);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
hpfs_error(dir->i_sb, "hpfs_lookup: can't get inode");
|
hpfs_error(dir->i_sb, "hpfs_lookup: can't get inode");
|
||||||
|
result = ERR_PTR(-ENOMEM);
|
||||||
goto bail1;
|
goto bail1;
|
||||||
}
|
}
|
||||||
if (result->i_state & I_NEW) {
|
if (result->i_state & I_NEW) {
|
||||||
@@ -266,6 +267,8 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, unsigned in
|
|||||||
|
|
||||||
if (de->has_acl || de->has_xtd_perm) if (!sb_rdonly(dir->i_sb)) {
|
if (de->has_acl || de->has_xtd_perm) if (!sb_rdonly(dir->i_sb)) {
|
||||||
hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures");
|
hpfs_error(result->i_sb, "ACLs or XPERM found. This is probably HPFS386. This driver doesn't support it now. Send me some info on these structures");
|
||||||
|
iput(result);
|
||||||
|
result = ERR_PTR(-EINVAL);
|
||||||
goto bail1;
|
goto bail1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,29 +304,17 @@ struct dentry *hpfs_lookup(struct inode *dir, struct dentry *dentry, unsigned in
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bail1:
|
||||||
hpfs_brelse4(&qbh);
|
hpfs_brelse4(&qbh);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Made it.
|
* Made it.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
end:
|
end:
|
||||||
end_add:
|
end_add:
|
||||||
hpfs_unlock(dir->i_sb);
|
hpfs_unlock(dir->i_sb);
|
||||||
d_add(dentry, result);
|
return d_splice_alias(result, dentry);
|
||||||
return NULL;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Didn't.
|
|
||||||
*/
|
|
||||||
bail1:
|
|
||||||
|
|
||||||
hpfs_brelse4(&qbh);
|
|
||||||
|
|
||||||
/*bail:*/
|
|
||||||
|
|
||||||
hpfs_unlock(dir->i_sb);
|
|
||||||
return ERR_PTR(-ENOENT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct file_operations hpfs_dir_ops =
|
const struct file_operations hpfs_dir_ops =
|
||||||
|
|||||||
Reference in New Issue
Block a user