From 13cc7b59b5480c35e861b4c2109b928fd12049d9 Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Thu, 16 Feb 2017 15:16:42 +0100 Subject: [PATCH] wmhdplop: fix integer overflow 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);