When traversing global in_ifaddr list in the IFP_TO_IA() macro, we need

to obtain IN_IFADDR_RLOCK().
This commit is contained in:
Gleb Smirnoff 2012-07-18 08:41:00 +00:00
parent 3a3ef28e15
commit b9abeb9d99

View File

@ -161,14 +161,16 @@ do { \
#define IFP_TO_IA(ifp, ia) \ #define IFP_TO_IA(ifp, ia) \
/* struct ifnet *ifp; */ \ /* struct ifnet *ifp; */ \
/* struct in_ifaddr *ia; */ \ /* struct in_ifaddr *ia; */ \
{ \ do { \
IN_IFADDR_RLOCK(); \
for ((ia) = TAILQ_FIRST(&V_in_ifaddrhead); \ for ((ia) = TAILQ_FIRST(&V_in_ifaddrhead); \
(ia) != NULL && (ia)->ia_ifp != (ifp); \ (ia) != NULL && (ia)->ia_ifp != (ifp); \
(ia) = TAILQ_NEXT((ia), ia_link)) \ (ia) = TAILQ_NEXT((ia), ia_link)) \
continue; \ continue; \
if ((ia) != NULL) \ if ((ia) != NULL) \
ifa_ref(&(ia)->ia_ifa); \ ifa_ref(&(ia)->ia_ifa); \
} IN_IFADDR_RUNLOCK(); \
} while (0)
#endif #endif
/* /*