mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
Linux: Fix use-after-free in zfsvfs_create()
Coverity reported that we pass a pointer to zfsvfs to `dmu_objset_disown()` after freeing zfsvfs in zfsvfs_create_impl() after a failure in zfsvfs_init(). We have nearly identical duplicate versions of this code for FreeBSD and Linux, but interestingly, the FreeBSD version of this code differs in such a way that it does not suffer from this bug. We remove the difference from the FreeBSD version to fix this bug. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Richard Yao <richard.yao@alumni.stonybrook.edu> Closes #13883
This commit is contained in:
parent
042d43a1dd
commit
891ac937be
@ -784,9 +784,7 @@ zfsvfs_create(const char *osname, boolean_t readonly, zfsvfs_t **zfvp)
|
||||
}
|
||||
|
||||
error = zfsvfs_create_impl(zfvp, zfsvfs, os);
|
||||
if (error != 0) {
|
||||
dmu_objset_disown(os, B_TRUE, zfsvfs);
|
||||
}
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
@ -826,6 +824,7 @@ zfsvfs_create_impl(zfsvfs_t **zfvp, zfsvfs_t *zfsvfs, objset_t *os)
|
||||
|
||||
error = zfsvfs_init(zfsvfs, os);
|
||||
if (error != 0) {
|
||||
dmu_objset_disown(os, B_TRUE, zfsvfs);
|
||||
*zfvp = NULL;
|
||||
zfsvfs_free(zfsvfs);
|
||||
return (error);
|
||||
|
Loading…
Reference in New Issue
Block a user