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
This commit is contained in:
Mikael Magnusson 2017-02-16 15:16:42 +01:00 committed by Carlos R. Mafra
parent 24b831f9b9
commit 13cc7b59b5
3 changed files with 12 additions and 12 deletions

View file

@ -9,7 +9,7 @@ typedef struct DiskList {
unsigned major, minor; unsigned major, minor;
int hd_id, part_id; /* part_id = 0 for disks */ int hd_id, part_id; /* part_id = 0 for disks */
int enable_hddtemp; int enable_hddtemp;
int nr, nw, touched_r, touched_w; long nr, nw, touched_r, touched_w;
struct DiskList *next; struct DiskList *next;
} DiskList; } DiskList;

View file

@ -8,7 +8,7 @@
static ProcStats ps; static ProcStats ps;
int use_proc_diskstats; 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; pst->nslice = nslice;
ALLOC_VEC(pst->slices, nslice); ALLOC_VEC(pst->slices, nslice);
pst->cur_slice = 0; 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) { 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; return pst->slices[idx]/pst->update_interval;
} }
@ -100,13 +100,13 @@ void update_stats() {
if (!Prefs.debug_disk_rd) { if (!Prefs.debug_disk_rd) {
pstat_add(&ps.disk_read, nr); pstat_add(&ps.disk_read, nr);
} else { } 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); pstat_add(&ps.disk_read, nr + cntr);
} }
if (!Prefs.debug_disk_wr) { if (!Prefs.debug_disk_wr) {
pstat_add(&ps.disk_write, nw); pstat_add(&ps.disk_write, nw);
} else { } 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); pstat_add(&ps.disk_write, nw + cntw);
} }
readok = 2; readok = 2;
@ -120,7 +120,7 @@ void update_stats() {
pstat_add(&ps.swap_in, nr); pstat_add(&ps.swap_in, nr);
pstat_add(&ps.swap_out, nw); pstat_add(&ps.swap_out, nw);
} else { } 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_in, nr + cnt);
pstat_add(&ps.swap_out, nw + cnt); pstat_add(&ps.swap_out, nw + cnt);
} }
@ -143,10 +143,10 @@ void init_stats(float update_interval) {
char s[512]; char s[512];
FILE *f; FILE *f;
pstat_init(&ps.swap_in, (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, (int)(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, (int)(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, (int)(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"); f = fopen("/proc/swaps","r");
//if (!f) { perror("/proc/swaps"); exit(1); } //if (!f) { perror("/proc/swaps"); exit(1); }
if (f) { if (f) {

View file

@ -4,7 +4,7 @@
struct pstat { struct pstat {
unsigned long total; unsigned long total;
int nslice, cur_slice; long nslice, cur_slice;
unsigned long *slices; unsigned long *slices;
float update_interval; float update_interval;
}; };
@ -15,7 +15,7 @@ typedef struct {
struct pstat disk_read, disk_write; struct pstat disk_read, disk_write;
} ProcStats; } 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); float pstat_current(struct pstat *pst);
void pstat_add(struct pstat *pst, unsigned long v); void pstat_add(struct pstat *pst, unsigned long v);
void pstat_advance(struct pstat *pst); void pstat_advance(struct pstat *pst);