Fix a panic caused by doing "ifconfig -am" while a lagg is being destroyed.
The thread that is destroying the lagg has already set sc->sc_psc=NULL when the "ifconfig -am" thread gets to lacp_req(). It tries to dereference sc->sc_psc and panics. The solution is for lacp_req() to check the value of sc->sc_psc. If NULL, harmlessly return an lacp_opreq structure full of zeros. Full details in GNATS. PR: kern/189003 Reviewed by: timeout on freebsd-net@ MFC after: 3 weeks Sponsored by: Spectra Logic Corporation
This commit is contained in:
parent
cd85ba9385
commit
f544a74870
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=265232
@ -590,10 +590,20 @@ lacp_req(struct lagg_softc *sc, caddr_t data)
|
||||
{
|
||||
struct lacp_opreq *req = (struct lacp_opreq *)data;
|
||||
struct lacp_softc *lsc = LACP_SOFTC(sc);
|
||||
struct lacp_aggregator *la = lsc->lsc_active_aggregator;
|
||||
struct lacp_aggregator *la;
|
||||
|
||||
LACP_LOCK(lsc);
|
||||
bzero(req, sizeof(struct lacp_opreq));
|
||||
|
||||
/*
|
||||
* If the LACP softc is NULL, return with the opreq structure full of
|
||||
* zeros. It is normal for the softc to be NULL while the lagg is
|
||||
* being destroyed.
|
||||
*/
|
||||
if (NULL == lsc)
|
||||
return;
|
||||
|
||||
la = lsc->lsc_active_aggregator;
|
||||
LACP_LOCK(lsc);
|
||||
if (la != NULL) {
|
||||
req->actor_prio = ntohs(la->la_actor.lip_systemid.lsi_prio);
|
||||
memcpy(&req->actor_mac, &la->la_actor.lip_systemid.lsi_mac,
|
||||
|
Loading…
Reference in New Issue
Block a user