summaryrefslogtreecommitdiffstats
path: root/net/l2tp/l2tp_ppp.c
diff options
context:
space:
mode:
authorGuillaume Nault <g.nault@alphalink.fr>2018-08-10 13:21:58 +0200
committerDavid S. Miller <davem@davemloft.net>2018-08-11 12:13:49 -0700
commitbdd0292f96e43de46283ea0efdef8d13b4ffe895 (patch)
treee87f71ffc50028abb3743f05e978ffc647c9e39d /net/l2tp/l2tp_ppp.c
parent01e28b921b19cb99a09dda89ab0e5dc49bf4ab38 (diff)
downloadlinux-bdd0292f96e43de46283ea0efdef8d13b4ffe895.tar.gz
linux-bdd0292f96e43de46283ea0efdef8d13b4ffe895.tar.bz2
linux-bdd0292f96e43de46283ea0efdef8d13b4ffe895.zip
l2tp: simplify pppol2tp_ioctl()
* 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>
Diffstat (limited to 'net/l2tp/l2tp_ppp.c')
-rw-r--r--net/l2tp/l2tp_ppp.c33
1 files 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);
}
/*****************************************************************************