From 2994d6d7003e5d66fee83f38399a702d73fce449 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Tue, 9 Jul 2024 12:37:13 +1000 Subject: [PATCH] Properly compute the physical memory size On a 32 bit machine casting to size_t can still lead to an overflow. Cast to uint64_t. Also detect all possible negative values for pages and pagesize to silence warning about possible negative value. 39#if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) 1. tainted_data_return: Called function sysconf(_SC_PHYS_PAGES), and a possible return value may be less than zero. 2. assign: Assigning: pages = sysconf(_SC_PHYS_PAGES). 40 long pages = sysconf(_SC_PHYS_PAGES); 41 long pagesize = sysconf(_SC_PAGESIZE); 42 3. Condition pages == -1, taking false branch. 4. Condition pagesize == -1, taking false branch. 43 if (pages == -1 || pagesize == -1) { 44 return (0); 45 } 46 5. overflow: The expression (size_t)pages * pagesize might be negative, but is used in a context that treats it as unsigned. CID 498034: (#1 of 1): Overflowed return value (INTEGER_OVERFLOW) 6. return_overflow: (size_t)pages * pagesize, which might have underflowed, is returned from the function. 47 return ((size_t)pages * pagesize); 48#endif /* if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) */ (cherry picked from commit e8dbc5db929c40174780b95540e33cc228bb2391) --- lib/isc/meminfo.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/isc/meminfo.c b/lib/isc/meminfo.c index 612cceaed3..6d68afec6e 100644 --- a/lib/isc/meminfo.c +++ b/lib/isc/meminfo.c @@ -40,11 +40,11 @@ isc_meminfo_totalphys(void) { long pages = sysconf(_SC_PHYS_PAGES); long pagesize = sysconf(_SC_PAGESIZE); - if (pages == -1 || pagesize == -1) { + if (pages < 0 || pagesize < 0) { return (0); } - return ((size_t)pages * pagesize); + return ((uint64_t)pages * pagesize); #endif /* if defined(_SC_PHYS_PAGES) && defined(_SC_PAGESIZE) */ return (0); }