locks: fix a memory leak bug in __break_lease()
In __break_lease(), the file lock 'new_fl' is allocated in lease_alloc(). However, it is not deallocated in the following execution if smp_load_acquire() fails, leading to a memory leak bug. To fix this issue, free 'new_fl' before returning the error. Signed-off-by: Wenwen Wang <wenwen@cs.uga.edu> Signed-off-by: Jeff Layton <jlayton@kernel.org>
This commit is contained in:
@@ -1592,7 +1592,7 @@ int __break_lease(struct inode *inode, unsigned int mode, unsigned int type)
|
|||||||
ctx = smp_load_acquire(&inode->i_flctx);
|
ctx = smp_load_acquire(&inode->i_flctx);
|
||||||
if (!ctx) {
|
if (!ctx) {
|
||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
return error;
|
goto free_lock;
|
||||||
}
|
}
|
||||||
|
|
||||||
percpu_down_read(&file_rwsem);
|
percpu_down_read(&file_rwsem);
|
||||||
@@ -1672,6 +1672,7 @@ out:
|
|||||||
spin_unlock(&ctx->flc_lock);
|
spin_unlock(&ctx->flc_lock);
|
||||||
percpu_up_read(&file_rwsem);
|
percpu_up_read(&file_rwsem);
|
||||||
locks_dispose_list(&dispose);
|
locks_dispose_list(&dispose);
|
||||||
|
free_lock:
|
||||||
locks_free_lock(new_fl);
|
locks_free_lock(new_fl);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user