From 9724ff032929f1a1a7c3d0e6bd68894f34b4699b Mon Sep 17 00:00:00 2001 From: Bartosz Podrygajlo Date: Wed, 26 Jun 2024 17:15:58 +0200 Subject: [PATCH] Fix memory leaks and heap buffer overflow in test_thread-pool. --- common/utils/threadPool/test/test_thread-pool.c | 14 ++++++++++++-- common/utils/threadPool/thread-pool.h | 4 +++- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/common/utils/threadPool/test/test_thread-pool.c b/common/utils/threadPool/test/test_thread-pool.c index 0d6defd5cb..1af3dc1020 100644 --- a/common/utils/threadPool/test/test_thread-pool.c +++ b/common/utils/threadPool/test/test_thread-pool.c @@ -46,7 +46,7 @@ void displayList(notifiedFIFO_t *nf) struct testData { int id; int sleepTime; - char txt[30]; + char txt[50]; }; void processing(void *arg) @@ -64,21 +64,27 @@ int main() logInit(); notifiedFIFO_t myFifo; initNotifiedFIFO(&myFifo); + int num_elements_on_queue = 0; pushNotifiedFIFO(&myFifo, newNotifiedFIFO_elt(sizeof(struct testData), 1234, NULL, NULL)); + num_elements_on_queue++; for (int i = 10; i > 1; i--) { pushNotifiedFIFO(&myFifo, newNotifiedFIFO_elt(sizeof(struct testData), 1000 + i, NULL, NULL)); + num_elements_on_queue++; } displayList(&myFifo); notifiedFIFO_elt_t *tmp = pullNotifiedFIFO(&myFifo); printf("pulled: %lu\n", tmp->key); displayList(&myFifo); + delNotifiedFIFO_elt(tmp); tmp = pullNotifiedFIFO(&myFifo); + num_elements_on_queue--; printf("pulled: %lu\n", tmp->key); displayList(&myFifo); pushNotifiedFIFO(&myFifo, newNotifiedFIFO_elt(sizeof(struct testData), 12345678, NULL, NULL)); displayList(&myFifo); + delNotifiedFIFO_elt(tmp); do { tmp = pollNotifiedFIFO(&myFifo); @@ -86,9 +92,12 @@ int main() if (tmp) { printf("pulled: %lu\n", tmp->key); displayList(&myFifo); + delNotifiedFIFO_elt(tmp); + num_elements_on_queue--; } else printf("Empty list \n"); - } while (tmp); + } while (num_elements_on_queue > 0); + AssertFatal(pollNotifiedFIFO(&myFifo) == NULL, "Unexpected extra element on queue\n"); tpool_t pool; char params[] = "1,2,3,4,5"; @@ -129,5 +138,6 @@ int main() dur / 1000, cumulProcessTime / 1000, (dur - cumulProcessTime) / (1000 * nb_jobs)); + abortTpool(&pool); return 0; } diff --git a/common/utils/threadPool/thread-pool.h b/common/utils/threadPool/thread-pool.h index 1a78e20134..b0e1b9e4e8 100644 --- a/common/utils/threadPool/thread-pool.h +++ b/common/utils/threadPool/thread-pool.h @@ -336,7 +336,9 @@ static inline int abortTpool(tpool_t *t) { thread = t->allthreads; while (thread != NULL) { pthread_cancel(thread->threadID); - thread = thread->next; + struct one_thread *next = thread->next; + free(thread); + thread = next; } return nbRemoved;