Blob Blame History Raw
From: Stefan Raspl <raspl@linux.ibm.com>
Subject: net/smc: move sock lock in smc_ioctl()
Patch-mainline: v4.18
Git-commit: 7311d665ca68907b9c43d6d1021f816f9a7bbd57
References: FATE#325698, LTC#167867, bsc#1113481

Description:  smc: Latest upstream fixes and extensions up to 8/17/2018

Upstream-Description:

              net/smc: move sock lock in smc_ioctl()

              When an SMC socket is connecting it is decided whether fallback to
              TCP is needed. To avoid races between connect and ioctl move the
              sock lock before the use_fallback check.

              Reported-by: syzbot+5b2cece1a8ecb2ca77d8@syzkaller.appspotmail.com
              Reported-by: syzbot+19557374321ca3710990@syzkaller.appspotmail.com
              Fixes: 1992d99882af ("net/smc: take sock lock in smc_ioctl()")
              Signed-off-by: Ursula Braun <ubraun@linux.ibm.com>
              Signed-off-by: David S. Miller <davem@davemloft.net>

Signed-off-by: Stefan Raspl <raspl@linux.ibm.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 net/smc/af_smc.c |   10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -1521,12 +1521,16 @@ static int smc_ioctl(struct socket *sock
 
 	smc = smc_sk(sock->sk);
 	conn = &smc->conn;
+	lock_sock(&smc->sk);
 	if (smc->use_fallback) {
-		if (!smc->clcsock)
+		if (!smc->clcsock) {
+			release_sock(&smc->sk);
 			return -EBADF;
-		return smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg);
+		}
+		answ = smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg);
+		release_sock(&smc->sk);
+		return answ;
 	}
-	lock_sock(&smc->sk);
 	switch (cmd) {
 	case SIOCINQ: /* same as FIONREAD */
 		if (smc->sk.sk_state == SMC_LISTEN) {