From f885561fda56d3b6eb47b1979a547b49a00954a2 Mon Sep 17 00:00:00 2001
From: Daniel Collins <solemnwarning@solemnwarning.net>
Date: Sat, 27 May 2023 17:39:13 +0100
Subject: [ksysguardd] Use size_t for storing process memory usage.

Avoids the process memory usage rolling over at 4GiB on 64-bit systems.

Signed-off-by: Daniel Collins <solemnwarning@solemnwarning.net>
---
 ksysguard/ksysguardd/FreeBSD/ProcessList.c | 18 ++++++------------
 ksysguard/ksysguardd/Linux/ProcessList.c   |  8 ++++----
 ksysguard/ksysguardd/NetBSD/ProcessList.c  | 20 +++++++-------------
 ksysguard/ksysguardd/OpenBSD/ProcessList.c | 20 +++++++-------------
 4 files changed, 24 insertions(+), 42 deletions(-)

diff --git a/ksysguard/ksysguardd/FreeBSD/ProcessList.c b/ksysguard/ksysguardd/FreeBSD/ProcessList.c
index f8d2c3ba6..dbb330efb 100644
--- a/ksysguard/ksysguardd/FreeBSD/ProcessList.c
+++ b/ksysguard/ksysguardd/FreeBSD/ProcessList.c
@@ -98,18 +98,12 @@ typedef struct
 	 * The total amount of memory the process uses. This includes shared and
 	 * swapped memory.
 	 */
-	unsigned int vmSize;
+	size_t vmSize;
 
 	/*
 	 * The amount of physical memory the process currently uses.
 	 */
-	unsigned int vmRss;
-
-	/*
-	 * The amount of memory (shared/swapped/etc) the process shares with
-	 * other processes.
-	 */
-	unsigned int vmLib;
+	size_t vmRss;
 
 	/*
 	 * The number of 1/100 of a second the process has spend in user space.
@@ -264,20 +258,20 @@ updateProcess(int pid)
 #if __FreeBSD_version >= 500015
 		ps->userLoad = 100.0 * (double) p.ki_pctcpu / fscale;
 	ps->vmSize   = p.ki_size;
-	ps->vmRss    = p.ki_rssize * getpagesize();
+	ps->vmRss    = (size_t)(p.ki_rssize) * (size_t)(getpagesize());
 	strlcpy(ps->name,p.ki_comm? p.ki_comm:"????",sizeof(ps->name));
 	strcpy(ps->status,(p.ki_stat>=1)&&(p.ki_stat<=5)? statuses[p.ki_stat-1]:"????");
 #elif defined (__DragonFly__) && __DragonFly_version >= 190000
 		ps->userLoad = 100.0 * (double) p.kp_lwp.kl_pctcpu / fscale;
 	ps->vmSize   = p.kp_vm_map_size;
-	ps->vmRss    = p.kp_vm_rssize * getpagesize();
+	ps->vmRss    = (size_t)(p.kp_vm_rssize) * (size_t)(getpagesize());
 	strlcpy(ps->name,p.kp_comm ? p.kp_comm : "????", 
 		sizeof(ps->name));
 	strcpy(ps->status,(p.kp_stat>=1)&&(p.kp_stat<=5)? statuses[p.kp_stat-1]:"????");
 #else
 	ps->userLoad = 100.0 * (double) p.kp_proc.p_pctcpu / fscale;
 	ps->vmSize   = p.kp_eproc.e_vm.vm_map.size;
-	ps->vmRss    = p.kp_eproc.e_vm.vm_rssize * getpagesize();
+	ps->vmRss    = (size_t)(p.kp_eproc.e_vm.vm_rssize) * (size_t)(getpagesize());
 #if defined (__DragonFly__)
 	strlcpy(ps->name,p.kp_thread.td_comm ? p.kp_thread.td_comm : "????",
 		sizeof(ps->name));
@@ -417,7 +411,7 @@ printProcessList(const char* cmd)
 	ps = first_ctnr(ProcessList); /* skip 'kernel' entry */
 	for (ps = next_ctnr(ProcessList); ps; ps = next_ctnr(ProcessList))
 	{
-		fprintf(CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%.2f\t%d\t%d\t%d\t%s\t%s\n",
+		fprintf(CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%.2f\t%d\t%zu\t%zu\t%s\t%s\n",
 			   ps->name, (long)ps->pid, (long)ps->ppid,
 			   (long)ps->uid, (long)ps->gid, ps->status,
 			   ps->userLoad, ps->sysLoad, ps->niceLevel,
diff --git a/ksysguard/ksysguardd/Linux/ProcessList.c b/ksysguard/ksysguardd/Linux/ProcessList.c
index 2708664bd..8582aae56 100644
--- a/ksysguard/ksysguardd/Linux/ProcessList.c
+++ b/ksysguard/ksysguardd/Linux/ProcessList.c
@@ -84,10 +84,10 @@ typedef struct {
     The total amount of memory the process uses. This includes shared and
     swapped memory.
    */
-  unsigned int vmSize;
+  size_t vmSize;
 
 	/* The amount of physical memory the process currently uses. */
-  unsigned int vmRss;
+  size_t vmRss;
 
 	/**
     The number of 1/100 of a second the process has spend in user space.
@@ -215,7 +215,7 @@ static int updateProcess( int pid )
     return -1;
 
   if ( fscanf( fd, "%*d %*s %c %d %d %*d %d %*d %*u %*u %*u %*u %*u %d %d"
-                   "%*d %*d %*d %d %*u %*u %*d %u %u",
+                   "%*d %*d %*d %d %*u %*u %*d %zu %zu",
                    &status, (int*)&ps->ppid, (int*)&ps->gid, &ps->ttyNo,
                    &userTime, &sysTime, &ps->niceLevel, &ps->vmSize,
                    &ps->vmRss) != 9 ) {
@@ -419,7 +419,7 @@ void printProcessList( const char* cmd )
   (void)cmd;
 
   for ( ps = first_ctnr( ProcessList ); ps; ps = next_ctnr( ProcessList ) ) {
-    fprintf( CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%.2f\t%d\t%d\t%d"
+    fprintf( CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%.2f\t%d\t%zu\t%zu"
              "\t%s\t%s\n", ps->name, (long)ps->pid, (long)ps->ppid,
              (long)ps->uid, (long)ps->gid, ps->status, ps->userLoad,
              ps->sysLoad, ps->niceLevel, ps->vmSize / 1024, ps->vmRss / 1024,
diff --git a/ksysguard/ksysguardd/NetBSD/ProcessList.c b/ksysguard/ksysguardd/NetBSD/ProcessList.c
index 13c65053d..a23af4cf3 100644
--- a/ksysguard/ksysguardd/NetBSD/ProcessList.c
+++ b/ksysguard/ksysguardd/NetBSD/ProcessList.c
@@ -91,18 +91,12 @@ typedef struct
 	 * The total amount of memory the process uses. This includes shared and
 	 * swapped memory.
 	 */
-	unsigned int vmSize;
+	size_t vmSize;
 
 	/*
 	 * The amount of physical memory the process currently uses.
 	 */
-	unsigned int vmRss;
-
-	/*
-	 * The amount of memory (shared/swapped/etc) the process shares with
-	 * other processes.
-	 */
-	unsigned int vmLib;
+	size_t vmRss;
 
 	/*
 	 * The number of 1/100 of a second the process has spend in user space.
@@ -200,10 +194,10 @@ updateProcess(int pid, struct kinfo_proc2 *p)
 	ps->userName[sizeof(ps->userName)-1]='\0';
 
         ps->userLoad = 100.0 * ((double)(p->p_pctcpu) /FSCALE);
-	ps->vmSize   = (p->p_vm_tsize +
-			p->p_vm_dsize +
-			p->p_vm_ssize) * getpagesize();
-	ps->vmRss    = p->p_vm_rssize * getpagesize();
+	ps->vmSize   = ((size_t)(p->p_vm_tsize) +
+			(size_t)(p->p_vm_dsize) +
+			(size_t)(p->p_vm_ssize)) * (size_t)(getpagesize());
+	ps->vmRss    = (size_t)(p->p_vm_rssize) * (size_t)(getpagesize());
 	strlcpy(ps->name,p->p_comm ? p->p_comm : "????", sizeof(ps->name));
 	strlcpy(ps->status,(p->p_stat<=7)? statuses[p->p_stat]:"????", sizeof(ps->status));
 
@@ -316,7 +310,7 @@ printProcessList(const char* cmd)
 	ps = first_ctnr(ProcessList); /* skip 'kernel' entry */
 	for (ps = next_ctnr(ProcessList); ps; ps = next_ctnr(ProcessList))
 	{
-		fprintf(CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%d\t%d\t%d\t%d\t%s\t%s\n",
+		fprintf(CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%d\t%d\t%zu\t%zu\t%s\t%s\n",
 			   ps->name, (long)ps->pid, (long)ps->ppid,
 			   (long)ps->uid, (long)ps->gid, ps->status,
 			   ps->userLoad, ps->priority, ps->niceLevel,
diff --git a/ksysguard/ksysguardd/OpenBSD/ProcessList.c b/ksysguard/ksysguardd/OpenBSD/ProcessList.c
index ccdcc2313..f84ff0b2d 100644
--- a/ksysguard/ksysguardd/OpenBSD/ProcessList.c
+++ b/ksysguard/ksysguardd/OpenBSD/ProcessList.c
@@ -88,18 +88,12 @@ typedef struct
 	 * The total amount of memory the process uses. This includes shared and
 	 * swapped memory.
 	 */
-	unsigned int vmSize;
+	size_t vmSize;
 
 	/*
 	 * The amount of physical memory the process currently uses.
 	 */
-	unsigned int vmRss;
-
-	/*
-	 * The amount of memory (shared/swapped/etc) the process shares with
-	 * other processes.
-	 */
-	unsigned int vmLib;
+	size_t vmRss;
 
 	/*
 	 * The number of 1/100 of a second the process has spend in user space.
@@ -245,10 +239,10 @@ updateProcess(struct kinfo_proc *p)
 	ps->userName[sizeof(ps->userName)-1]='\0';
 
         ps->userLoad = p->p_pctcpu / 100;
-	ps->vmSize   = (p->p_vm_tsize +
-			p->p_vm_dsize +
-			p->p_vm_ssize) * getpagesize();
-	ps->vmRss    = p->p_vm_rssize * getpagesize();
+	ps->vmSize   = ((size_t)(p->p_vm_tsize) +
+			(size_t)(p->p_vm_dsize) +
+			(size_t)(p->p_vm_ssize)) * (size_t)(getpagesize());
+	ps->vmRss    = (size_t)(p->p_vm_rssize) * (size_t)(getpagesize());
 	strlcpy(ps->name,p->p_comm ? p->p_comm : "????", sizeof(ps->name));
 	strlcpy(ps->status,(p->p_stat>=1)&&(p->p_stat<=5)? statuses[p->p_stat-1]:"????", sizeof(ps->status));
 
@@ -362,7 +356,7 @@ printProcessList(const char* cmd)
 
 	for (ps = first_ctnr(ProcessList); ps; ps = next_ctnr(ProcessList))
 	{
-		fprintf(CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%.2f\t%d\t%d\t%d\t%s\t%s\n",
+		fprintf(CurrentClient, "%s\t%ld\t%ld\t%ld\t%ld\t%s\t%.2f\t%.2f\t%d\t%zu\t%zu\t%s\t%s\n",
 			   ps->name, (long)ps->pid, (long)ps->ppid,
 			   (long)ps->uid, (long)ps->gid, ps->status,
 			   ps->userLoad, ps->sysLoad, ps->niceLevel,
-- 
cgit v1.2.3

