Lock ppp_mutex and check that file->private_data is NULL before executing any action in ppp_unattached_ioctl(). The test done by ppp_ioctl() can't be relied upon, because file->private_data may have been updated meanwhile. In which case ppp_unattached_ioctl() will override file->private_data and mess up reference counters or loose pointer to previously allocated PPP unit.
In case the test fails, -ENOTTY is returned, just like if ppp_ioctl() had rejected the ioctl in the first place. Signed-off-by: Guillaume Nault <g.na...@alphalink.fr> --- This seems to originate in BKL removalĀ : f3ff8a4d80e8 ("ppp: push BKL down into the driver") moved the test on file->private_data (in ppp_ioctl()) out of BKL protection. BKL was then replaced by ppp_mutex in 15fd0cd9a2ad ("net: autoconvert trivial BKL users to private mutex"). drivers/net/ppp/ppp_generic.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index d61da9ec..d1dbcb6 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -845,6 +845,11 @@ static int ppp_unattached_ioctl(struct net *net, struct ppp_file *pf, int __user *p = (int __user *)arg; mutex_lock(&ppp_mutex); + if (file->private_data) { + mutex_unlock(&ppp_mutex); + return -ENOTTY; + } + switch (cmd) { case PPPIOCNEWUNIT: /* Create a new ppp unit */ -- 2.7.0