diff mbox series

cifs: Use after free in debug code

Message ID Y3dw8KLm7MDgACCY@kili
State New
Headers show
Series cifs: Use after free in debug code | expand

Commit Message

Dan Carpenter Nov. 18, 2022, 11:48 a.m. UTC
This debug code dereferences "old_iface" after it was already freed by
the call to release_iface().  Re-order the debugging to avoid this
issue.

Fixes: b54034a73baf ("cifs: during reconnect, update interface if necessary")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
 fs/cifs/sess.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Paulo Alcantara Nov. 18, 2022, 2:48 p.m. UTC | #1
Dan Carpenter <error27@gmail.com> writes:

> This debug code dereferences "old_iface" after it was already freed by
> the call to release_iface().  Re-order the debugging to avoid this
> issue.
>
> Fixes: b54034a73baf ("cifs: during reconnect, update interface if necessary")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> ---
>  fs/cifs/sess.c | 4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)

Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Steve French Nov. 19, 2022, 7:59 p.m. UTC | #2
merged into cifs-2.6.git for-next

On Fri, Nov 18, 2022 at 8:48 AM Paulo Alcantara via samba-technical
<samba-technical@lists.samba.org> wrote:
>
> Dan Carpenter <error27@gmail.com> writes:
>
> > This debug code dereferences "old_iface" after it was already freed by
> > the call to release_iface().  Re-order the debugging to avoid this
> > issue.
> >
> > Fixes: b54034a73baf ("cifs: during reconnect, update interface if necessary")
> > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> > ---
> >  fs/cifs/sess.c | 4 ++--
> >  1 file changed, 2 insertions(+), 2 deletions(-)
>
> Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
>
diff mbox series

Patch

diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
index 92e4278ec35d..9e7d9f0baa18 100644
--- a/fs/cifs/sess.c
+++ b/fs/cifs/sess.c
@@ -302,14 +302,14 @@  cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server)
 
 	/* now drop the ref to the current iface */
 	if (old_iface && iface) {
-		kref_put(&old_iface->refcount, release_iface);
 		cifs_dbg(FYI, "replacing iface: %pIS with %pIS\n",
 			 &old_iface->sockaddr,
 			 &iface->sockaddr);
-	} else if (old_iface) {
 		kref_put(&old_iface->refcount, release_iface);
+	} else if (old_iface) {
 		cifs_dbg(FYI, "releasing ref to iface: %pIS\n",
 			 &old_iface->sockaddr);
+		kref_put(&old_iface->refcount, release_iface);
 	} else {
 		WARN_ON(!iface);
 		cifs_dbg(FYI, "adding new iface: %pIS\n", &iface->sockaddr);