Module: wine Branch: refs/heads/master Commit: 3df59e4feeb4f3a930af997741334420b09210f2 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3df59e4feeb4f3a930af9977...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Jun 15 11:38:20 2006 +0200
kernel32: Use unsigned types in GlobalMemoryStatusEx to prevent overflows.
---
dlls/kernel/heap.c | 65 +++++++++++++++++++++------------------------------- 1 files changed, 26 insertions(+), 39 deletions(-)
diff --git a/dlls/kernel/heap.c b/dlls/kernel/heap.c index 06f6aa2..dc481c4 100644 --- a/dlls/kernel/heap.c +++ b/dlls/kernel/heap.c @@ -1172,12 +1172,14 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMO #ifdef linux FILE *f; #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) - int *tmp, size_sys, mib[2]; + unsigned long val; + int size_sys, mib[2]; #elif defined(__APPLE__) - int *tmp, mib[2]; + unsigned int val; + int mib[2]; size_t size_sys; #elif defined(sun) - long pagesize,maxpages,freepages,swapspace,swapfree; + unsigned long pagesize,maxpages,freepages,swapspace,swapfree; struct anoninfo swapinf; int rval; #endif @@ -1200,36 +1202,37 @@ #ifdef linux if (f) { char buffer[256]; - int total, used, free, shared, buffers, cached; + unsigned long total, used, free, shared, buffers, cached;
lpmemex->ullTotalPhys = lpmemex->ullAvailPhys = 0; lpmemex->ullTotalPageFile = lpmemex->ullAvailPageFile = 0; while (fgets( buffer, sizeof(buffer), f )) { /* old style /proc/meminfo ... */ - if (sscanf( buffer, "Mem: %d %d %d %d %d %d", &total, &used, &free, &shared, &buffers, &cached )) + if (sscanf( buffer, "Mem: %lu %lu %lu %lu %lu %lu", + &total, &used, &free, &shared, &buffers, &cached )) { lpmemex->ullTotalPhys += total; lpmemex->ullAvailPhys += free + buffers + cached; } - if (sscanf( buffer, "Swap: %d %d %d", &total, &used, &free )) + if (sscanf( buffer, "Swap: %lu %lu %lu", &total, &used, &free )) { lpmemex->ullTotalPageFile += total; lpmemex->ullAvailPageFile += free; }
/* new style /proc/meminfo ... */ - if (sscanf(buffer, "MemTotal: %d", &total)) + if (sscanf(buffer, "MemTotal: %lu", &total)) lpmemex->ullTotalPhys = total*1024; - if (sscanf(buffer, "MemFree: %d", &free)) + if (sscanf(buffer, "MemFree: %lu", &free)) lpmemex->ullAvailPhys = free*1024; - if (sscanf(buffer, "SwapTotal: %d", &total)) + if (sscanf(buffer, "SwapTotal: %lu", &total)) lpmemex->ullTotalPageFile = total*1024; - if (sscanf(buffer, "SwapFree: %d", &free)) + if (sscanf(buffer, "SwapFree: %lu", &free)) lpmemex->ullAvailPageFile = free*1024; - if (sscanf(buffer, "Buffers: %d", &buffers)) + if (sscanf(buffer, "Buffers: %lu", &buffers)) lpmemex->ullAvailPhys += buffers*1024; - if (sscanf(buffer, "Cached: %d", &cached)) + if (sscanf(buffer, "Cached: %lu", &cached)) lpmemex->ullAvailPhys += cached*1024; } fclose( f ); @@ -1245,33 +1248,17 @@ #ifdef linux #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__APPLE__) mib[0] = CTL_HW; mib[1] = HW_PHYSMEM; - sysctl(mib, 2, NULL, &size_sys, NULL, 0); - tmp = malloc(size_sys * sizeof(int)); - sysctl(mib, 2, tmp, &size_sys, NULL, 0); - if (tmp && *tmp) - { - lpmemex->ullTotalPhys = *tmp; - free(tmp); - mib[1] = HW_USERMEM; - sysctl(mib, 2, NULL, &size_sys, NULL, 0); - tmp = malloc(size_sys * sizeof(int)); - sysctl(mib, 2, tmp, &size_sys, NULL, 0); - if (tmp && *tmp) - { - lpmemex->ullAvailPhys = *tmp; - lpmemex->ullTotalPageFile = *tmp; - lpmemex->ullAvailPageFile = *tmp; - lpmemex->dwMemoryLoad = lpmemex->ullTotalPhys - lpmemex->ullAvailPhys; - } else - { - lpmemex->ullAvailPhys = lpmemex->ullTotalPhys; - lpmemex->ullTotalPageFile = lpmemex->ullTotalPhys; - lpmemex->ullAvailPageFile = lpmemex->ullTotalPhys; - lpmemex->dwMemoryLoad = 0; - } - free(tmp); - - } + size_sys = sizeof(val); + sysctl(mib, 2, &val, &size_sys, NULL, 0); + if (val) lpmemex->ullTotalPhys = val; + mib[1] = HW_USERMEM; + size_sys = sizeof(val); + sysctl(mib, 2, &val, &size_sys, NULL, 0); + if (!val) val = lpmemex->ullTotalPhys; + lpmemex->ullAvailPhys = val; + lpmemex->ullTotalPageFile = val; + lpmemex->ullAvailPageFile = val; + lpmemex->dwMemoryLoad = lpmemex->ullTotalPhys - lpmemex->ullAvailPhys; #elif defined ( sun ) pagesize=sysconf(_SC_PAGESIZE); maxpages=sysconf(_SC_PHYS_PAGES);