Fix race in devfs by using LIST_FIRST() instead of

LIST_FOREACH_SAFE() when freeing the devfs private
data entries.

Reviewed by:	kib
MFC after:	3 days
Approved by:	thompsa (mentor)
This commit is contained in:
Hans Petter Selasky 2010-12-11 08:44:10 +00:00
parent da52b4caaf
commit 0bad52e1d8
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=216371

View File

@ -926,7 +926,7 @@ static void
destroy_devl(struct cdev *dev)
{
struct cdevsw *csw;
struct cdev_privdata *p, *p1;
struct cdev_privdata *p;
mtx_assert(&devmtx, MA_OWNED);
KASSERT(dev->si_flags & SI_NAMED,
@ -974,7 +974,7 @@ destroy_devl(struct cdev *dev)
dev_unlock();
notify_destroy(dev);
mtx_lock(&cdevpriv_mtx);
LIST_FOREACH_SAFE(p, &cdev2priv(dev)->cdp_fdpriv, cdpd_list, p1) {
while ((p = LIST_FIRST(&cdev2priv(dev)->cdp_fdpriv)) != NULL) {
devfs_destroy_cdevpriv(p);
mtx_lock(&cdevpriv_mtx);
}