From 8c58865aa5547cf8b859650bb2213a1d64195f96 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Thu, 7 Feb 2019 22:39:03 +0100 Subject: [PATCH] Fix potential memory leak in cpu enumeration An early return after a failed call to sched_getaffinity would leak the memory allocated for the cpu_set_t. Also the size parameter to the sched_getaffinity call could be incorrect, increasing the likelyhood of that failure Fixes #2003 --- driver/others/memory.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/driver/others/memory.c b/driver/others/memory.c index 2e185593e..f35700d28 100644 --- a/driver/others/memory.c +++ b/driver/others/memory.c @@ -216,7 +216,7 @@ int i,n; #endif #if !__GLIBC_PREREQ(2, 7) - ret = sched_getaffinity(0,sizeof(cpu_set_t), cpusetp); + ret = sched_getaffinity(0,sizeof(cpusetp), cpusetp); if (ret!=0) return nums; n=0; #if !__GLIBC_PREREQ(2, 6) @@ -224,15 +224,18 @@ int i,n; if (CPU_ISSET(i,cpusetp)) n++; nums=n; #else - nums = CPU_COUNT(sizeof(cpu_set_t),cpusetp); + nums = CPU_COUNT(sizeof(cpusetp),cpusetp); #endif return nums; #else cpusetp = CPU_ALLOC(nums); if (cpusetp == NULL) return nums; size = CPU_ALLOC_SIZE(nums); - ret = sched_getaffinity(0,size,cpusetp); - if (ret!=0) return nums; + ret = sched_getaffinity(0,sizeof(cpusetp),cpusetp); + if (ret!=0) { + CPU_FREE(cpusetp); + return nums; + } ret = CPU_COUNT_S(size,cpusetp); if (ret > 0 && ret < nums) nums = ret; CPU_FREE(cpusetp); @@ -1728,7 +1731,7 @@ int i,n; #endif #if !__GLIBC_PREREQ(2, 7) - ret = sched_getaffinity(0,sizeof(cpu_set_t), cpusetp); + ret = sched_getaffinity(0,sizeof(cpusetp), cpusetp); if (ret!=0) return nums; n=0; #if !__GLIBC_PREREQ(2, 6) @@ -1736,15 +1739,18 @@ int i,n; if (CPU_ISSET(i,cpusetp)) n++; nums=n; #else - nums = CPU_COUNT(sizeof(cpu_set_t),cpusetp); + nums = CPU_COUNT(sizeof(cpusetp),cpusetp); #endif return nums; #else cpusetp = CPU_ALLOC(nums); if (cpusetp == NULL) return nums; size = CPU_ALLOC_SIZE(nums); - ret = sched_getaffinity(0,size,cpusetp); - if (ret!=0) return nums; + ret = sched_getaffinity(0,sizeof(cpusetp),cpusetp); + if (ret!=0) { + CPU_FREE(cpusetp); + return nums; + } ret = CPU_COUNT_S(size,cpusetp); if (ret > 0 && ret < nums) nums = ret; CPU_FREE(cpusetp);