Make sure musycc driver deals with the possibility of any type of mbuf
allocation not succeeding. In this case, make sure the driver doesn't leak any memory by freeing all necessary buffers; make sure to loop and free all the previously allocated mbufs in this routine. Reviewed by: alfred
This commit is contained in:
parent
f8761e53a7
commit
e1a0b830b5
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=70724
@ -1204,7 +1204,17 @@ musycc_connect(hook_p hook)
|
||||
sc->mdt[ch][i].data = 0;
|
||||
|
||||
MGETHDR(m, M_TRYWAIT, MT_DATA);
|
||||
if (m == NULL)
|
||||
goto errfree;
|
||||
MCLGET(m, M_TRYWAIT);
|
||||
if ((m->m_flags M_EXT) == 0) {
|
||||
/* We've waited mbuf_wait and still got nothing.
|
||||
We're calling with M_TRYWAIT anyway - a little
|
||||
defensive programming costs us very little - if
|
||||
anything at all in the case of error. */
|
||||
m_free(m);
|
||||
goto errfree;
|
||||
}
|
||||
sc->mdr[ch][i].m = m;
|
||||
sc->mdr[ch][i].data = vtophys(m->m_data);
|
||||
sc->mdr[ch][i].status = 1600; /* MTU */
|
||||
@ -1224,6 +1234,16 @@ musycc_connect(hook_p hook)
|
||||
hook->peer->flags |= HK_QUEUE;
|
||||
|
||||
return (0);
|
||||
|
||||
errfree:
|
||||
while (i > 0) {
|
||||
/* Don't leak all the previously allocated mbufs in this loop */
|
||||
i--;
|
||||
m_free(sc->mdr[ch][i].m);
|
||||
}
|
||||
FREE(sc->mdt[ch], M_MUSYCC);
|
||||
FREE(sc->mdr[ch], M_MUSYCC);
|
||||
return (ENOBUFS);
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
Reference in New Issue
Block a user