]> git.baikalelectronics.ru Git - kernel.git/commit
Merge branch 'l2tp_session_find-fixes'
authorDavid S. Miller <davem@davemloft.net>
Sun, 2 Apr 2017 03:16:42 +0000 (20:16 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 2 Apr 2017 03:16:42 +0000 (20:16 -0700)
commit9e45b4f62a6afd0b60b092ee059fb089ca19772f
tree7143c7c597ae638f5b9587c576824e8aec91523d
parent973ecfc8ffd407e1da67fca090d721eeda1bb4ea
parent47a06dba51bad4ddaf06d8cec775fdb69f296074
Merge branch 'l2tp_session_find-fixes'

Guillaume Nault says:

====================
l2tp: fix usage of l2tp_session_find()

l2tp_session_find() doesn't take a reference on the session returned to
its caller. Virtually all l2tp_session_find() users are racy, either
because the session can disappear from under them or because they take
a reference too late. This leads to bugs like 'use after free' or
failure to notice duplicate session creations.

In some cases, taking a reference on the session is not enough. The
special callbacks .ref() and .deref() also have to be called in cases
where the PPP pseudo-wire uses the socket associated with the session.
Therefore, when looking up a session, we also have to pass a flag
indicating if the .ref() callback has to be called.

In the future, we probably could drop the .ref() and .deref() callbacks
entirely by protecting the .sock field of struct pppol2tp_session with
RCU, thus allowing it to be freed and set to NULL even if the L2TP
session is still alive.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>