Skip to content

Commit bd7d180

Browse files
committed
udev_enumerate.c: fix possible memory leak
Early return due to pthread_create() failure causes memory leak.
1 parent eb30a8b commit bd7d180

File tree

1 file changed

+11
-11
lines changed

1 file changed

+11
-11
lines changed

udev_enumerate.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -276,23 +276,20 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path)
276276
struct udev_enumerate_thread *thread;
277277
pthread_mutex_t mutex;
278278
struct dirent **de;
279-
int cnt, i;
279+
int ret, cnt, i;
280280

281281
cnt = scandir(path, &de, filter_dot, NULL);
282282

283283
if (cnt == -1) {
284284
return 0;
285285
}
286286

287+
ret = 1;
287288
thread = calloc(cnt, sizeof(struct udev_enumerate_thread));
288289

289290
if (!thread) {
290-
for (i = 0; i < cnt; i++) {
291-
free(de[i]);
292-
}
293-
294-
free(de);
295-
return 0;
291+
ret = 0;
292+
goto free_de;
296293
}
297294

298295
pthread_mutex_init(&mutex, NULL);
@@ -304,22 +301,25 @@ static int scan_devices(struct udev_enumerate *udev_enumerate, const char *path)
304301
snprintf(thread[i].path, sizeof(thread[i].path), "%s/%s", path, de[i]->d_name);
305302

306303
if (pthread_create(&thread[i].thread, NULL, add_device, &thread[i]) != 0) {
307-
return 0;
304+
ret = 0;
305+
break;
308306
}
309307
}
310308

311309
for (i = 0; i < cnt; i++) {
312310
pthread_join(thread[i].thread, NULL);
313311
}
314312

313+
free(thread);
314+
pthread_mutex_destroy(&mutex);
315+
316+
free_de:
315317
for (i = 0; i < cnt; i++) {
316318
free(de[i]);
317319
}
318320

319321
free(de);
320-
free(thread);
321-
pthread_mutex_destroy(&mutex);
322-
return 1;
322+
return ret;
323323
}
324324

325325
int udev_enumerate_scan_devices(struct udev_enumerate *udev_enumerate)

0 commit comments

Comments
 (0)