| From 4f535fa783fa08e7f60c7733111aa83cbf64746d Mon Sep 17 00:00:00 2001 |
| From: Ridge Kennedy <ridge.kennedy@alliedtelesis.co.nz> |
| Date: Tue, 4 Feb 2020 12:24:00 +1300 |
| Subject: [PATCH] l2tp: Allow duplicate session creation with UDP |
| |
| commit 0d0d9a388a858e271bb70e71e99e7fe2a6fd6f64 upstream. |
| |
| In the past it was possible to create multiple L2TPv3 sessions with the |
| same session id as long as the sessions belonged to different tunnels. |
| The resulting sessions had issues when used with IP encapsulated tunnels, |
| but worked fine with UDP encapsulated ones. Some applications began to |
| rely on this behaviour to avoid having to negotiate unique session ids. |
| |
| Some time ago a change was made to require session ids to be unique across |
| all tunnels, breaking the applications making use of this "feature". |
| |
| This change relaxes the duplicate session id check to allow duplicates |
| if both of the colliding sessions belong to UDP encapsulated tunnels. |
| |
| Fixes: dbdbc73b4478 ("l2tp: fix duplicate session creation") |
| Signed-off-by: Ridge Kennedy <ridge.kennedy@alliedtelesis.co.nz> |
| Acked-by: James Chapman <jchapman@katalix.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/net/l2tp/l2tp_core.c b/net/l2tp/l2tp_core.c |
| index 105e5a7092e7..f5648c4e44c5 100644 |
| --- a/net/l2tp/l2tp_core.c |
| +++ b/net/l2tp/l2tp_core.c |
| @@ -322,8 +322,13 @@ int l2tp_session_register(struct l2tp_session *session, |
| |
| spin_lock_bh(&pn->l2tp_session_hlist_lock); |
| |
| + /* IP encap expects session IDs to be globally unique, while |
| + * UDP encap doesn't. |
| + */ |
| hlist_for_each_entry(session_walk, g_head, global_hlist) |
| - if (session_walk->session_id == session->session_id) { |
| + if (session_walk->session_id == session->session_id && |
| + (session_walk->tunnel->encap == L2TP_ENCAPTYPE_IP || |
| + tunnel->encap == L2TP_ENCAPTYPE_IP)) { |
| err = -EEXIST; |
| goto err_tlock_pnlock; |
| } |
| -- |
| 2.7.4 |
| |