Commit 309b44e
ksmbd: fix memory leaks and NULL deref in smb2_lock()
smb2_lock() has three error handling issues after list_del() detaches
smb_lock from lock_list at no_check_cl:
1) If vfs_lock_file() returns an unexpected error in the non-UNLOCK
path, goto out leaks smb_lock and its flock because the out:
handler only iterates lock_list and rollback_list, neither of
which contains the detached smb_lock.
2) If vfs_lock_file() returns -ENOENT in the UNLOCK path, goto out
leaks smb_lock and flock for the same reason. The error code
returned to the dispatcher is also stale.
3) In the rollback path, smb_flock_init() can return NULL on
allocation failure. The result is dereferenced unconditionally,
causing a kernel NULL pointer dereference. Add a NULL check to
prevent the crash and clean up the bookkeeping; the VFS lock
itself cannot be rolled back without the allocation and will be
released at file or connection teardown.
Fix cases 1 and 2 by hoisting the locks_free_lock()/kfree() to before
the if(!rc) check in the UNLOCK branch so all exit paths share one
free site, and by freeing smb_lock and flock before goto out in the
non-UNLOCK branch. Propagate the correct error code in both cases.
Fix case 3 by wrapping the VFS unlock in an if(rlock) guard and adding
a NULL check for locks_free_lock(rlock) in the shared cleanup.
Found via call-graph analysis using sqry.
Fixes: e2f3448 ("cifsd: add server-side procedures for SMB3")
Cc: [email protected]
Suggested-by: ChenXiaoSong <[email protected]>
Signed-off-by: Werner Kasselman <[email protected]>
Reviewed-by: ChenXiaoSong <[email protected]>
Acked-by: Namjae Jeon <[email protected]>
Signed-off-by: Steve French <[email protected]>1 parent 48623ec commit 309b44e
1 file changed
Lines changed: 18 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7592 | 7592 | | |
7593 | 7593 | | |
7594 | 7594 | | |
| 7595 | + | |
| 7596 | + | |
7595 | 7597 | | |
7596 | 7598 | | |
7597 | 7599 | | |
7598 | 7600 | | |
| 7601 | + | |
7599 | 7602 | | |
7600 | 7603 | | |
7601 | | - | |
7602 | | - | |
7603 | 7604 | | |
7604 | 7605 | | |
7605 | 7606 | | |
| |||
7668 | 7669 | | |
7669 | 7670 | | |
7670 | 7671 | | |
| 7672 | + | |
| 7673 | + | |
| 7674 | + | |
7671 | 7675 | | |
7672 | 7676 | | |
7673 | 7677 | | |
| |||
7698 | 7702 | | |
7699 | 7703 | | |
7700 | 7704 | | |
7701 | | - | |
7702 | | - | |
7703 | | - | |
| 7705 | + | |
| 7706 | + | |
| 7707 | + | |
| 7708 | + | |
7704 | 7709 | | |
7705 | | - | |
7706 | | - | |
7707 | | - | |
| 7710 | + | |
| 7711 | + | |
| 7712 | + | |
| 7713 | + | |
| 7714 | + | |
| 7715 | + | |
7708 | 7716 | | |
7709 | 7717 | | |
7710 | 7718 | | |
| |||
7714 | 7722 | | |
7715 | 7723 | | |
7716 | 7724 | | |
7717 | | - | |
| 7725 | + | |
| 7726 | + | |
7718 | 7727 | | |
7719 | 7728 | | |
7720 | 7729 | | |
| |||
0 commit comments