libmthread: resolve memory leaks on exception path
If libmthread runs into a memory allocation failure while attempting to enlarge its thread pool, it does not free up any preliminary allocations made so far. Reported by dcb314. This closes #152. Change-Id: Ib882a4544e4802a0eb0a53446b43997876cde633
This commit is contained in:
parent
ab712d1923
commit
815afbad33
@ -194,12 +194,22 @@ static int mthread_increase_thread_pool(void)
|
|||||||
new_tcb[i] = malloc(sizeof(mthread_tcb_t));
|
new_tcb[i] = malloc(sizeof(mthread_tcb_t));
|
||||||
if (new_tcb[i] == NULL) {
|
if (new_tcb[i] == NULL) {
|
||||||
mthread_debug("Can't allocate space for tcb");
|
mthread_debug("Can't allocate space for tcb");
|
||||||
|
/* Undo the allocations made so far. */
|
||||||
|
while (i-- > old_no_threads)
|
||||||
|
free(new_tcb[i]);
|
||||||
|
if (old_no_threads > 0) {
|
||||||
|
new_tcb = realloc(threads, old_no_threads *
|
||||||
|
sizeof(mthread_tcb_t *));
|
||||||
|
if (new_tcb == NULL)
|
||||||
|
mthread_panic("Unable to shrink tcb array");
|
||||||
|
} else
|
||||||
|
free(new_tcb);
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
memset(new_tcb[i], '\0', sizeof(mthread_tcb_t)); /* Clear entry */
|
memset(new_tcb[i], '\0', sizeof(mthread_tcb_t)); /* Clear entry */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We can breath again, let's tell the others about the good news */
|
/* We can breathe again, let's tell the others about the good news */
|
||||||
threads = new_tcb;
|
threads = new_tcb;
|
||||||
no_threads = new_no_threads;
|
no_threads = new_no_threads;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user