Alexandre Julliard : kernel32:
Use unsigned types in GlobalMemoryStatusEx to prevent overflows.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jun 15 07:12:28 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 3df59e4feeb4f3a930af997741334420b09210f2
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=3df59e4feeb4f3a930af997741334420b09210f2
Author: Alexandre Julliard <julliard at 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);
More information about the wine-cvs
mailing list