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_opreq *req = (struct lacp_opreq *)data;
|
||||||
struct lacp_softc *lsc = LACP_SOFTC(sc);
|
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));
|
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) {
|
if (la != NULL) {
|
||||||
req->actor_prio = ntohs(la->la_actor.lip_systemid.lsi_prio);
|
req->actor_prio = ntohs(la->la_actor.lip_systemid.lsi_prio);
|
||||||
memcpy(&req->actor_mac, &la->la_actor.lip_systemid.lsi_mac,
|
memcpy(&req->actor_mac, &la->la_actor.lip_systemid.lsi_mac,
|
||||||
|
Loading…
Reference in New Issue
Block a user