Crash in accounting code: encode_long(), due to bad rusage data?
    Diomidis Spinellis 
    dds at aueb.gr
       
    Sun Aug 19 16:32:46 PDT 2007
    
    
  
Robert Watson wrote:
> I recently upgraded two servers from FreeBSD 6-STABLE to FreeBSD 
> 7-CURRENT in anticipation of the forthcoming release.  Both of them run 
> with accounting enabled at all times.  When a large pine session was 
> exiting on one of the two boxes, I ran into the following panic:
> 
> panic: encode_long: -ve value -32749
Getting rid of the panic is easy:
--- kern_acct.c	2007-08-20 01:15:18.000000000 +0300
+++ kern_acct.c.new	2007-08-20 01:16:06.000000000 +0300
@@ -523,8 +523,7 @@
  	int norm_exp;	/* Normalized exponent */
  	int shift;
-	KASSERT(val >= 0,  ("encode_long: -ve value %ld", val));
-	if (val == 0)
+	if (val <= 0)
  		return (0);
  	norm_exp = fls(val) - 1;
  	shift = FLT_MANT_DIG - norm_exp - 1;
However, as you wrote, this doesn't fix the root of the problem.
> I find the large negative value in ru_idrss somewhat sad to contemplate, 
> and while this could well be a problem with capturing of process runtime 
> information, I'd like it if the accounting code were robust against this 
> sort of bug, rather than panicking, and I guess I'd also rather than the 
> process runtime information also be correctly captured :-).
Do you think it makes any sense for encode_long to be correctly encoding 
negative numbers, or should we concentrate on locating and fixing the 
negative ru_idrss problem?
Diomidis Spinellis - http://www.spinellis.gr
    
    
More information about the freebsd-current
mailing list