l2tp: simplify pppol2tp_ioctl()
authorGuillaume Nault <g.nault@alphalink.fr>
Fri, 10 Aug 2018 11:21:58 +0000 (13:21 +0200)
committerDavid S. Miller <davem@davemloft.net>
Sat, 11 Aug 2018 19:13:49 +0000 (12:13 -0700)
* Drop test on 'sk': sock->sk cannot be NULL, or pppox_ioctl() could
    not have called us.

  * Drop test on 'SOCK_DEAD' state: if this flag was set, the socket
    would be in the process of being released and no ioctl could be
    running anymore.

  * Drop test on 'PPPOX_*' state: we depend on ->sk_user_data to get
    the session structure. If it is non-NULL, then the socket is
    connected. Testing for PPPOX_* is redundant.

  * Retrieve session using ->sk_user_data directly, instead of going
    through pppol2tp_sock_to_session(). This avoids grabbing a useless
    reference on the socket.

Signed-off-by: Guillaume Nault <g.nault@alphalink.fr>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/l2tp/l2tp_ppp.c

index cd43d02..e3ed8d4 100644 (file)
@@ -1179,28 +1179,12 @@ static int pppol2tp_tunnel_ioctl(struct l2tp_tunnel *tunnel,
 static int pppol2tp_ioctl(struct socket *sock, unsigned int cmd,
                          unsigned long arg)
 {
-       struct sock *sk = sock->sk;
        struct l2tp_session *session;
        struct l2tp_tunnel *tunnel;
-       int err;
-
-       if (!sk)
-               return 0;
-
-       err = -EBADF;
-       if (sock_flag(sk, SOCK_DEAD) != 0)
-               goto end;
-
-       err = -ENOTCONN;
-       if ((sk->sk_user_data == NULL) ||
-           (!(sk->sk_state & (PPPOX_CONNECTED | PPPOX_BOUND))))
-               goto end;
 
-       /* Get session context from the socket */
-       err = -EBADF;
-       session = pppol2tp_sock_to_session(sk);
-       if (session == NULL)
-               goto end;
+       session = sock->sk->sk_user_data;
+       if (!session)
+               return -ENOTCONN;
 
        /* Special case: if session's session_id is zero, treat ioctl as a
         * tunnel ioctl
@@ -1208,16 +1192,11 @@ static int pppol2tp_ioctl(struct socket *sock, unsigned int cmd,
        if ((session->session_id == 0) &&
            (session->peer_session_id == 0)) {
                tunnel = session->tunnel;
-               err = pppol2tp_tunnel_ioctl(tunnel, cmd, arg);
-               goto end_put_sess;
-       }
 
-       err = pppol2tp_session_ioctl(session, cmd, arg);
+               return pppol2tp_tunnel_ioctl(tunnel, cmd, arg);
+       }
 
-end_put_sess:
-       sock_put(sk);
-end:
-       return err;
+       return pppol2tp_session_ioctl(session, cmd, arg);
 }
 
 /*****************************************************************************