From 2bf7b3855c2a9c0931bf5a8bb5029a5c84d106c1 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Mon, 11 Apr 2016 17:57:19 +0200 Subject: [PATCH] linux: fix fd leaks in uv_cpu_info() error paths Introduced in commit 6798876a, "linux: fix cpu count". PR-URL: https://github.com/libuv/libuv/pull/822 Reviewed-By: Colin Ihrig --- src/unix/linux-core.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/unix/linux-core.c b/src/unix/linux-core.c index 66cb7fa6..333dbe80 100644 --- a/src/unix/linux-core.c +++ b/src/unix/linux-core.c @@ -591,26 +591,23 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { err = uv__cpu_num(statfile_fp, &numcpus); if (err < 0) - return err; + goto out; assert(numcpus != (unsigned int) -1); assert(numcpus != 0); + err = -ENOMEM; ci = uv__calloc(numcpus, sizeof(*ci)); if (ci == NULL) - return -ENOMEM; + goto out; err = read_models(numcpus, ci); if (err == 0) err = read_times(statfile_fp, numcpus, ci); - if (fclose(statfile_fp)) - if (errno != EINTR && errno != EINPROGRESS) - abort(); - if (err) { uv_free_cpu_info(ci, numcpus); - return err; + goto out; } /* read_models() on x86 also reads the CPU speed from /proc/cpuinfo. @@ -621,8 +618,15 @@ int uv_cpu_info(uv_cpu_info_t** cpu_infos, int* count) { *cpu_infos = ci; *count = numcpus; + err = 0; - return 0; +out: + + if (fclose(statfile_fp)) + if (errno != EINTR && errno != EINPROGRESS) + abort(); + + return err; }