udev_enumerate.c: fix possible memory leak
Early return due to pthread_create() failure causes memory leak.
This commit is contained in:
parent
eb30a8bc85
commit
bd7d1803e6
1 changed files with 11 additions and 11 deletions
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue