Wietse Venema:
> The code in question is 
> 
> double  smtpd_space_multf = 1.5;
> 
> #define BLOCKS(x)       ((x) / fsbuf.block_size)
> 
>     if (BLOCKS(var_queue_minfree) >= fsbuf.block_free
>      || BLOCKS(var_message_limit) >= fsbuf.block_free / smtpd_space_multf) {
>         (void) smtpd_check_reject(state, MAIL_ERROR_RESOURCE,
...
> The test has two conditions, and one of them is true. In addition
> we know that fsbuf.block_free * fsbuf.block_size = 908328873984
> which is a plausible value (this number is logged in a warning
> message). So both fsbuf.block_free and fsbuf.block_size are
> likely good.
> 
> - If the first condition is true, then the queue_minfree parameter
>   has a small non-zero value. As this is parameter is not read from
>   main.cf, perhaps its compiled-in default value has changed due
>   to a bit-flip in non-ECC memory? A reboot would change that.
> 
> - If the second condition is true, then the message_size_limit
>   parameter has a very large value. As this is read from main.cf
>   and converted to number every time a process starts, a bad
>   bit-flip in the message_size_limit value is unlikely.

In addition we know that the smtpd_space_multf value is good, because
it is logged in a warning message.

My bet is that the queue_minfree variable is corrupted after a
bit-flip. This variable is compile-time initialized, so the value
is read from the smtpd executable file, and my bet is that VM system
keeps much of that file cached in memory.  One bit-flip in some
"data" section can affect all smtpd processes.

        Wietse

Reply via email to