1
0
Fork 0

udev_enumerate.c: fix possible memory leak

Early return due to pthread_create() failure causes memory leak.
This commit is contained in:
illiliti 2021-06-11 13:55:00 +03:00
parent eb30a8bc85
commit bd7d1803e6

View file

@ -276,7 +276,7 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path)
struct udev_enumerate_thread *thread; struct udev_enumerate_thread *thread;
pthread_mutex_t mutex; pthread_mutex_t mutex;
struct dirent **de; struct dirent **de;
int cnt, i; int ret, cnt, i;
cnt = scandir(path, &de, filter_dot, NULL); 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; return 0;
} }
ret = 1;
thread = calloc(cnt, sizeof(struct udev_enumerate_thread)); thread = calloc(cnt, sizeof(struct udev_enumerate_thread));
if (!thread) { if (!thread) {
for (i = 0; i < cnt; i++) { ret = 0;
free(de[i]); goto free_de;
}
free(de);
return 0;
} }
pthread_mutex_init(&mutex, NULL); 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); 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) { 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); pthread_join(thread[i].thread, NULL);
} }
free(thread);
pthread_mutex_destroy(&mutex);
free_de:
for (i = 0; i < cnt; i++) { for (i = 0; i < cnt; i++) {
free(de[i]); free(de[i]);
} }
free(de); free(de);
free(thread); return ret;
pthread_mutex_destroy(&mutex);
return 1;
} }
int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate) int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)