In addition to clamping NumP and AvP, this patch reorders
shift operations to prevent possible overflow when given
values that are found in some environments where a 64-bit
system is running with a 32-bit personality.

It should not be construed as fixing any bug in mbuffer.

--- a/mbuffer.c
+++ b/mbuffer.c
@@ -984,7 +984,14 @@
 
 	/* get physical memory size */
 #if defined(_SC_PHYS_PAGES)
-	NumP = sysconf(_SC_PHYS_PAGES);
+	if (sizeof(void *) == 4)
+	{
+		NumP = (unsigned)-1 / PgSz; /* 4GB worth of pages */
+	}
+	else
+	{
+		NumP = sysconf(_SC_PHYS_PAGES);
+	}
 	if (NumP < 0) {
 		warningmsg("unable to determine number of total memory pages: %s\n",strerror(errno));
 		NumP = 0;
@@ -1004,8 +1011,12 @@
 			char *at = strstr(tmp,"MemAvailable:");
 			if (at) {
 				AvP = strtol(at+13,0,0);
-				AvP <<= 10;
 				AvP /= PgSz;
+				AvP <<= 10;
+				if (sizeof(void *) == 4 && AvP > NumP)
+				{
+					AvP = NumP;
+				}
 				debugmsg("available memory: %lu pages\n",AvP);
 			}
 		}