aboutsummaryrefslogtreecommitdiffstats
path: root/net/smc
diff options
context:
space:
mode:
authorUrsula Braun <ubraun@linux.ibm.com>2018-08-08 08:13:21 -0400
committerDavid S. Miller <davem@davemloft.net>2018-08-08 22:14:22 -0400
commit7311d665ca68907b9c43d6d1021f816f9a7bbd57 (patch)
tree3edc813b7168552a1ca9afad1f04b698a65f371e /net/smc
parentbd58c7e0860f54710907903ed6daff699d1fc5b9 (diff)
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>
Diffstat (limited to 'net/smc')
-rw-r--r--net/smc/af_smc.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 0ee7721afbe5..e7de5f282722 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -1522,12 +1522,16 @@ static int smc_ioctl(struct socket *sock, unsigned int cmd,
1522 1522
1523 smc = smc_sk(sock->sk); 1523 smc = smc_sk(sock->sk);
1524 conn = &smc->conn; 1524 conn = &smc->conn;
1525 lock_sock(&smc->sk);
1525 if (smc->use_fallback) { 1526 if (smc->use_fallback) {
1526 if (!smc->clcsock) 1527 if (!smc->clcsock) {
1528 release_sock(&smc->sk);
1527 return -EBADF; 1529 return -EBADF;
1528 return smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg); 1530 }
1531 answ = smc->clcsock->ops->ioctl(smc->clcsock, cmd, arg);
1532 release_sock(&smc->sk);
1533 return answ;
1529 } 1534 }
1530 lock_sock(&smc->sk);
1531 switch (cmd) { 1535 switch (cmd) {
1532 case SIOCINQ: /* same as FIONREAD */ 1536 case SIOCINQ: /* same as FIONREAD */
1533 if (smc->sk.sk_state == SMC_LISTEN) { 1537 if (smc->sk.sk_state == SMC_LISTEN) {