net/smc: move sock lock in smc_ioctl() [Linux 4.18]

This Linux kernel change "net/smc: move sock lock in smc_ioctl()" is included in the Linux 4.18 release. This change is authored by Ursula Braun <ubraun [at] linux.ibm.com> on Wed Aug 8 14:13:21 2018 +0200. The commit for this change in Linux stable tree is 7311d66 (patch).

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: [email protected]
Reported-by: [email protected]
Fixes: 1992d99882af ("net/smc: take sock lock in smc_ioctl()")
Signed-off-by: Ursula Braun <[email protected]>
Signed-off-by: David S. Miller <[email protected]>

There are 10 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 net/smc/af_smc.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index 0ee7721..e7de5f2 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,

    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) {

Leave a Reply

Your email address will not be published. Required fields are marked *