audit 5: findings of the two reviews
- The e2e's numeric-settings test ran a container that passed every gate
and never ended: the good values are checked beside a bad one after
them; each run is named, bounded to a minute and removed.
- The gates refuse a value under the parameter's minimum (a zero window
kills anvil, a zero milter timeout smtpd) and one past an int, in
seconds for a time value (src/global/conv_time.c, src/anvil/anvil.c).
- OpenDKIM waits, five seconds at most, for the relay's socket.
- The relay marks its lines `syslog: `, writes control characters out,
reads into a queue at once and drops past 200 lines a second, saying
how many (security F1, F2; a stuck relay would hold OpenDKIM in
syslog(3)).
- smtp_tls_mandatory_protocols >=TLSv1.2 too.
- extract-cert.sh keeps the old files' group and sets its trap before
mktemp.
- crashexit spares cert-reload; architecture.md "four times running" and
what else exits the container; security.md the restart after five panel
exits and the /dev/log socket.
- Measured against the technical review: smtpd has the selfpost group
(Groups 104 998), so it did reach the supervisor socket before this
stage.
Accepted, reasons in the plan: the logrotate state file in the postfix
user's directory, envdoc_test's reading of `${VAR:-}` only, crashexit's
window pruning untested.
Tested on the test server: go vet + go test of 27 packages, make e2e (all
pass, 592 s) on this tree.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
// checkLogrotateConfigMode verifies the image pins /etc/logrotate.d/mail at 0644
|
||||
@@ -21,7 +22,14 @@ func checkLogrotateConfigMode(s *stack) error {
|
||||
if mode != "644" {
|
||||
return fmt.Errorf("/etc/logrotate.d/mail mode is %q, want 644", mode)
|
||||
}
|
||||
return nil
|
||||
// The state file is beside the log, under /data, so a recreated container
|
||||
// keeps when mail.log was last rotated (audit 2026-10-12, M19); the loop
|
||||
// runs logrotate at once when it starts.
|
||||
return waitFor("logrotate's state under /data/log", 20*time.Second, 500*time.Millisecond, func() (bool, error) {
|
||||
out, _ := s.execIn("selfpost", "sh", "-c", "test -s /data/log/.logrotate.status && echo yes")
|
||||
out = strings.TrimSpace(out)
|
||||
return out == "yes", fmt.Errorf("state file: %q", out)
|
||||
})
|
||||
}
|
||||
|
||||
// checkLogrotateRotation forces a rotation and checks the recreated mail.log is
|
||||
|
||||
Reference in New Issue
Block a user