ceph: fix use-after-free on symlink traversal
free the symlink body after the same RCU delay we have for freeing the struct inode itself, so that traversal during RCU pathwalk wouldn't step into freed memory. Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Reviewed-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
This commit is contained in:
parent
187df76325
commit
daf5cc27ee
@ -524,6 +524,7 @@ static void ceph_i_callback(struct rcu_head *head)
|
||||
struct inode *inode = container_of(head, struct inode, i_rcu);
|
||||
struct ceph_inode_info *ci = ceph_inode(inode);
|
||||
|
||||
kfree(ci->i_symlink);
|
||||
kmem_cache_free(ceph_inode_cachep, ci);
|
||||
}
|
||||
|
||||
@ -566,7 +567,6 @@ void ceph_destroy_inode(struct inode *inode)
|
||||
}
|
||||
}
|
||||
|
||||
kfree(ci->i_symlink);
|
||||
while ((n = rb_first(&ci->i_fragtree)) != NULL) {
|
||||
frag = rb_entry(n, struct ceph_inode_frag, node);
|
||||
rb_erase(n, &ci->i_fragtree);
|
||||
|
Loading…
Reference in New Issue
Block a user