From 41ee49975c8b95755b0b831a11d61c48ba9a4d5d Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 14 May 2014 12:40:05 +0000 Subject: [PATCH] Use wxMemorySize type in Unix implementation of wxGetFreeMemory(). This should avoid overflows on 32 bit systems with more than 2GB of RAM. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_3_0_BRANCH@76529 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/unix/utilsunx.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/unix/utilsunx.cpp b/src/unix/utilsunx.cpp index eaad981623..868d5e57d9 100644 --- a/src/unix/utilsunx.cpp +++ b/src/unix/utilsunx.cpp @@ -1177,7 +1177,7 @@ wxMemorySize wxGetFreeMemory() FILE *fp = fopen("/proc/meminfo", "r"); if ( fp ) { - long memFree = -1; + wxMemorySize memFreeBytes = (wxMemorySize)-1; char buf[1024]; if ( fgets(buf, WXSIZEOF(buf), fp) && fgets(buf, WXSIZEOF(buf), fp) ) @@ -1185,7 +1185,8 @@ wxMemorySize wxGetFreeMemory() // /proc/meminfo changed its format in kernel 2.6 if ( wxPlatformInfo().CheckOSVersion(2, 6) ) { - if ( sscanf(buf, "MemFree: %ld", &memFree) == 1 ) + unsigned long memFree; + if ( sscanf(buf, "MemFree: %lu", &memFree) == 1 ) { // We consider memory used by the IO buffers and cache as // being "free" too as Linux aggressively uses free memory @@ -1206,19 +1207,24 @@ wxMemorySize wxGetFreeMemory() } // values here are always expressed in kB and we want bytes - memFree *= 1024; + memFreeBytes = memFree; + memFreeBytes *= 1024; } } else // Linux 2.4 (or < 2.6, anyhow) { - long memTotal, memUsed; - sscanf(buf, "Mem: %ld %ld %ld", &memTotal, &memUsed, &memFree); + long memTotal, memUsed, memFree; + if ( sscanf(buf, "Mem: %ld %ld %ld", + &memTotal, &memUsed, &memFree) == 3 ) + { + memFreeBytes = memFree; + } } } fclose(fp); - return (wxMemorySize)memFree; + return memFreeBytes; } #elif defined(__SGI__) struct rminfo realmem;