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:
		
							parent
							
								
									24b831f9b9
								
							
						
					
					
						commit
						13cc7b59b5
					
				
					 3 changed files with 12 additions and 12 deletions
				
			
		| 
						 | 
					@ -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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue