From bd7d1803e6930eb40778c5ca8ee80ccb8b7bac11 Mon Sep 17 00:00:00 2001 From: illiliti Date: Fri, 11 Jun 2021 13:55:00 +0300 Subject: [PATCH] udev_enumerate.c: fix possible memory leak Early return due to pthread_create() failure causes memory leak. --- udev_enumerate.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/udev_enumerate.c b/udev_enumerate.c index 6f02610..449da4f 100644 --- a/udev_enumerate.c +++ b/udev_enumerate.c @@ -276,7 +276,7 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path) struct udev_enumerate_thread *thread; pthread_mutex_t mutex; struct dirent **de; - int cnt, i; + int ret, cnt, i; cnt = scandir(path, &de, filter_dot, NULL); @@ -284,15 +284,12 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path) return 0; } + ret = 1; thread = calloc(cnt, sizeof(struct udev_enumerate_thread)); if (!thread) { - for (i = 0; i < cnt; i++) { - free(de[i]); - } - - free(de); - return 0; + ret = 0; + goto free_de; } pthread_mutex_init(&mutex, NULL); @@ -304,7 +301,8 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path) snprintf(thread[i].path, sizeof(thread[i].path), "%s/%s", path, de[i]->d_name); if (pthread_create(&thread[i].thread, NULL, add_device, &thread[i]) != 0) { - return 0; + ret = 0; + break; } } @@ -312,14 +310,16 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path) pthread_join(thread[i].thread, NULL); } + free(thread); + pthread_mutex_destroy(&mutex); + +free_de: for (i = 0; i < cnt; i++) { free(de[i]); } free(de); - free(thread); - pthread_mutex_destroy(&mutex); - return 1; + return ret; } int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)