* 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.na...@alphalink.fr>
---
 net/l2tp/l2tp_ppp.c | 33 ++++++---------------------------
 1 file changed, 6 insertions(+), 27 deletions(-)

diff --git a/net/l2tp/l2tp_ppp.c b/net/l2tp/l2tp_ppp.c
index cd43d02484e4..e3ed8d473d91 100644
--- a/net/l2tp/l2tp_ppp.c
+++ b/net/l2tp/l2tp_ppp.c
@@ -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);
 }
 
 /*****************************************************************************
-- 
2.18.0

Reply via email to