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