|
@@ -1141,11 +1141,18 @@ static int pppol2tp_tunnel_ioctl(struct l2tp_tunnel *tunnel,
|
|
|
if (stats.session_id != 0) {
|
|
|
/* resend to session ioctl handler */
|
|
|
struct l2tp_session *session =
|
|
|
- l2tp_session_find(sock_net(sk), tunnel, stats.session_id);
|
|
|
- if (session != NULL)
|
|
|
- err = pppol2tp_session_ioctl(session, cmd, arg);
|
|
|
- else
|
|
|
+ l2tp_session_get(sock_net(sk), tunnel,
|
|
|
+ stats.session_id, true);
|
|
|
+
|
|
|
+ if (session) {
|
|
|
+ err = pppol2tp_session_ioctl(session, cmd,
|
|
|
+ arg);
|
|
|
+ if (session->deref)
|
|
|
+ session->deref(session);
|
|
|
+ l2tp_session_dec_refcount(session);
|
|
|
+ } else {
|
|
|
err = -EBADR;
|
|
|
+ }
|
|
|
break;
|
|
|
}
|
|
|
#ifdef CONFIG_XFRM
|