From 4111f29c3f110d7e45727f30a6a2b475a5e228fc Mon Sep 17 00:00:00 2001 From: Maurus Decimus <11444311+mdecimus@users.noreply.github.com> Date: Tue, 28 Apr 2026 12:00:52 +0200 Subject: [PATCH] Fix: Skip invalid entries in log files --- CHANGELOG.md | 1 + crates/jmap/src/registry/mapping/log.rs | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8a25772..eefbe124 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ If you are upgrading from v0.16.x, replace the binary (or run `docker pull`). If - DNS Updater: - BunnyDNS: Use subdomain as name of record instead of FQDN. - RFC2136: Chunk TXT records. +- Skip invalid entries in log files. ## [0.16.1] - 2026-04-25 diff --git a/crates/jmap/src/registry/mapping/log.rs b/crates/jmap/src/registry/mapping/log.rs index 26907dd2..66536c1b 100644 --- a/crates/jmap/src/registry/mapping/log.rs +++ b/crates/jmap/src/registry/mapping/log.rs @@ -181,6 +181,11 @@ fn read_log_offsets( for line in rev_lines { let line = line?; offset = offset.saturating_sub(line.len() as u64 + 1); // +1 for the newline character + + if !is_log_header(&line) { + continue; + } + let id = (file_number << 48) | offset; if !found_anchor { @@ -267,6 +272,18 @@ fn read_log_entries( Ok(entries) } +fn is_log_header(line: &str) -> bool { + let line = strip_ansi(line); + let bytes = line.as_bytes(); + if bytes.is_empty() || !bytes[0].is_ascii_digit() { + return false; + } + let Some((timestamp, _)) = line.split_once(' ') else { + return false; + }; + DateTime::parse_from_rfc3339(timestamp).is_ok() +} + fn log_from_line(line: &str) -> Option { let line = strip_ansi(line); let (timestamp, rest) = line.split_once(' ')?;