[PATCH 1/2] wmhdplop: fix integer overflow

Bernard Cafarelli <[email protected]>
Newsgroups gmane.compw.window-managers.windowmaker.devel
Message-ID <[email protected]>
From: Mikael Magnusson <[email protected]>

After a while, the procstats fields will overflow the
signed int field and the hd leds will be permanently on.

Use long instead of int for these counters

Gentoo original bug: https://bugs.gentoo.org/show_bug.cgi?id=325615
---
 wmhdplop/devnames.h |  2 +-
 wmhdplop/procstat.c | 18 +++++++++---------
 wmhdplop/procstat.h |  4 ++--
 3 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/wmhdplop/devnames.h b/wmhdplop/devnames.h
index 0f57d41..15b0f73 100644
--- a/wmhdplop/devnames.h
+++ b/wmhdplop/devnames.h
@@ -9,7 +9,7 @@ typedef struct DiskList {
   unsigned major, minor;
   int hd_id, part_id; /* part_id = 0 for disks */
   int enable_hddtemp;
-  int nr, nw, touched_r, touched_w;
+  long nr, nw, touched_r, touched_w;
   struct DiskList *next;
 } DiskList;
 
diff --git a/wmhdplop/procstat.c b/wmhdplop/procstat.c
index e7eed1b..d51b53c 100644
--- a/wmhdplop/procstat.c
+++ b/wmhdplop/procstat.c
@@ -8,7 +8,7 @@
 static ProcStats ps;
 int use_proc_diskstats;
 
-void pstat_init(struct pstat *pst, int nslice, float update_interval) {
+void pstat_init(struct pstat *pst, long nslice, float update_interval) {
   pst->nslice = nslice;
   ALLOC_VEC(pst->slices, nslice);
   pst->cur_slice = 0;
@@ -17,7 +17,7 @@ void pstat_init(struct pstat *pst, int nslice, float update_interval) {
 }
 
 float pstat_current(struct pstat *pst) {
-  int idx = pst->cur_slice ? pst->cur_slice-1 : pst->nslice-1;
+  long idx = pst->cur_slice ? pst->cur_slice-1 : pst->nslice-1;
   return pst->slices[idx]/pst->update_interval;
 }
 
@@ -100,13 +100,13 @@ void update_stats() {
             if (!Prefs.debug_disk_rd) {
               pstat_add(&ps.disk_read, nr);
             } else {
-              static int cntr = 0; cntr+=(rand()%30) == 0 ? Prefs.debug_disk_rd : 0;
+              static long cntr = 0; cntr+=(rand()%30) == 0 ? Prefs.debug_disk_rd : 0;
               pstat_add(&ps.disk_read, nr + cntr);
             }
             if (!Prefs.debug_disk_wr) {
               pstat_add(&ps.disk_write, nw);
             } else {
-              static int cntw = 0; cntw+=(rand()%30) == 0 ? Prefs.debug_disk_wr : 0;
+              static long cntw = 0; cntw+=(rand()%30) == 0 ? Prefs.debug_disk_wr : 0;
               pstat_add(&ps.disk_write, nw + cntw);
             }
             readok = 2;
@@ -120,7 +120,7 @@ void update_stats() {
               pstat_add(&ps.swap_in, nr);
               pstat_add(&ps.swap_out, nw);
             } else {
-              static int cnt = 0; cnt+=Prefs.debug_swapio;
+              static long cnt = 0; cnt+=Prefs.debug_swapio;
               pstat_add(&ps.swap_in, nr + cnt);
               pstat_add(&ps.swap_out, nw + cnt);
             }
@@ -143,10 +143,10 @@ void init_stats(float update_interval) {
   char s[512];
   FILE *f;
 
-  pstat_init(&ps.swap_in, (int)(0.5/update_interval)+1, update_interval);
-  pstat_init(&ps.swap_out, (int)(0.5/update_interval)+1, update_interval);
-  pstat_init(&ps.disk_read, (int)(0.5/update_interval)+1, update_interval);
-  pstat_init(&ps.disk_write, (int)(0.5/update_interval)+1, update_interval);
+  pstat_init(&ps.swap_in, (long)(0.5/update_interval)+1, update_interval);
+  pstat_init(&ps.swap_out, (long)(0.5/update_interval)+1, update_interval);
+  pstat_init(&ps.disk_read, (long)(0.5/update_interval)+1, update_interval);
+  pstat_init(&ps.disk_write, (long)(0.5/update_interval)+1, update_interval);
   f = fopen("/proc/swaps","r");
   //if (!f) { perror("/proc/swaps"); exit(1); }
   if (f) {
diff --git a/wmhdplop/procstat.h b/wmhdplop/procstat.h
index 2107055..abce78f 100644
--- a/wmhdplop/procstat.h
+++ b/wmhdplop/procstat.h
@@ -4,7 +4,7 @@
 
 struct pstat {
   unsigned long total;
-  int nslice, cur_slice;
+  long nslice, cur_slice;
   unsigned long *slices;
   float update_interval;
 };
@@ -15,7 +15,7 @@ typedef struct {
   struct pstat disk_read, disk_write;
 } ProcStats;
 
-void pstat_init(struct pstat *pst, int nslice, float update_interval);
+void pstat_init(struct pstat *pst, long nslice, float update_interval);
 float pstat_current(struct pstat *pst);
 void pstat_add(struct pstat *pst, unsigned long v);
 void pstat_advance(struct pstat *pst);
-- 
2.11.1


-- 
To unsubscribe, send mail to [email protected].
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.