1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-19 10:53:58 +00:00

- Plugging a memory leak when malloc() failed during initialisation;

- Plugging another memory leak inside the destructor.

Reviewed by:	matk
MFC after:	3 weeks
This commit is contained in:
Tai-hwa Liang 2015-10-24 19:40:03 +00:00
parent d818f2b6b9
commit 671b575901
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=289888

View File

@ -319,6 +319,8 @@ midi_init(kobj_class_t cls, int unit, int channel, void *cookie)
goto err0;
m->synth = malloc(sizeof(*m->synth), M_MIDI, M_NOWAIT | M_ZERO);
if (m->synth == NULL)
goto err1;
kobj_init((kobj_t)m->synth, &midisynth_class);
m->synth->m = m;
kobj_init((kobj_t)m, cls);
@ -327,7 +329,7 @@ midi_init(kobj_class_t cls, int unit, int channel, void *cookie)
MIDI_DEBUG(1, printf("midiinit queues %d/%d.\n", inqsize, outqsize));
if (!inqsize && !outqsize)
goto err1;
goto err2;
mtx_init(&m->lock, "raw midi", NULL, 0);
mtx_init(&m->qlock, "q raw midi", NULL, 0);
@ -352,7 +354,7 @@ midi_init(kobj_class_t cls, int unit, int channel, void *cookie)
if ((inqsize && !MIDIQ_BUF(m->inq)) ||
(outqsize && !MIDIQ_BUF(m->outq)))
goto err2;
goto err3;
m->busy = 0;
@ -362,7 +364,7 @@ midi_init(kobj_class_t cls, int unit, int channel, void *cookie)
m->cookie = cookie;
if (MPU_INIT(m, cookie))
goto err2;
goto err3;
mtx_unlock(&m->lock);
mtx_unlock(&m->qlock);
@ -378,13 +380,14 @@ midi_init(kobj_class_t cls, int unit, int channel, void *cookie)
return m;
err2: mtx_destroy(&m->qlock);
err3: mtx_destroy(&m->qlock);
mtx_destroy(&m->lock);
if (MIDIQ_BUF(m->inq))
free(MIDIQ_BUF(m->inq), M_MIDI);
if (MIDIQ_BUF(m->outq))
free(MIDIQ_BUF(m->outq), M_MIDI);
err2: free(m->synth, M_MIDI);
err1: free(m, M_MIDI);
err0: mtx_unlock(&midistat_lock);
MIDI_DEBUG(1, printf("midi_init ended in error\n"));
@ -1388,6 +1391,7 @@ midi_destroy(struct snd_midi *m, int midiuninit)
free(MIDIQ_BUF(m->outq), M_MIDI);
mtx_destroy(&m->qlock);
mtx_destroy(&m->lock);
free(m->synth, M_MIDI);
free(m, M_MIDI);
return 0;
}