l2tp: fix duplicate session creation
l2tp_session_create() relies on its caller for checking for duplicate sessions. This is racy since a session can be concurrently inserted after the caller's verification. Fix this by letting l2tp_session_create() verify sessions uniqueness upon insertion. Callers need to be adapted to check for l2tp_session_create()'s return code instead of calling l2tp_session_find(). pppol2tp_connect() is a bit special because it has to work on existing sessions (if they're not connected) or to create a new session if none is found. When acting on a preexisting session, a reference must be held or it could go away on us. So we have to use l2tp_session_get() instead of l2tp_session_find() and drop the reference before exiting. Fixes:d9e31d17ce
("l2tp: Add L2TP ethernet pseudowire support") Fixes:fd558d186d
("l2tp: Split pppol2tp patch into separate l2tp and ppp parts") Signed-off-by: Guillaume Nault <g.nault@alphalink.fr> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:

committed by
David S. Miller

parent
57377d6354
commit
dbdbc73b44
@@ -221,12 +221,6 @@ static int l2tp_eth_create(struct net *net, u32 tunnel_id, u32 session_id, u32 p
|
||||
goto out;
|
||||
}
|
||||
|
||||
session = l2tp_session_find(net, tunnel, session_id);
|
||||
if (session) {
|
||||
rc = -EEXIST;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (cfg->ifname) {
|
||||
dev = dev_get_by_name(net, cfg->ifname);
|
||||
if (dev) {
|
||||
@@ -240,8 +234,8 @@ static int l2tp_eth_create(struct net *net, u32 tunnel_id, u32 session_id, u32 p
|
||||
|
||||
session = l2tp_session_create(sizeof(*spriv), tunnel, session_id,
|
||||
peer_session_id, cfg);
|
||||
if (!session) {
|
||||
rc = -ENOMEM;
|
||||
if (IS_ERR(session)) {
|
||||
rc = PTR_ERR(session);
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user