diff --git a/src/uu/tail/src/tail.rs b/src/uu/tail/src/tail.rs index 8782db36f..2ffb537cf 100644 --- a/src/uu/tail/src/tail.rs +++ b/src/uu/tail/src/tail.rs @@ -473,7 +473,9 @@ fn bounded_tail(file: &mut File, settings: &Settings) { return; } FilterMode::Bytes(Signum::Negative(count)) => { - file.seek(SeekFrom::End(-(*count as i64))).unwrap(); + if file.seek(SeekFrom::End(-(*count as i64))).is_err() { + file.seek(SeekFrom::Start(0)).unwrap(); + } limit = Some(*count); } FilterMode::Bytes(Signum::Positive(count)) if count > &1 => { diff --git a/tests/by-util/test_tail.rs b/tests/by-util/test_tail.rs index 390633704..134cc78eb 100644 --- a/tests/by-util/test_tail.rs +++ b/tests/by-util/test_tail.rs @@ -5040,6 +5040,22 @@ fn tail_n_lines_with_emoji() { .stdout_only("💐\n"); } +#[test] +fn test_tail_bytes_exceeds_file_size() { + let ts = TestScenario::new(util_name!()); + let at = &ts.fixtures; + + // Should be > 4096 bytes (block size can vary): + at.write("test_file.txt", &"x".repeat(5000)); + + ts.ucmd() + .arg("-c") + .arg("1048576") + .arg("test_file.txt") + .succeeds() + .stdout_only("x".repeat(5000)); +} + #[test] #[cfg(target_os = "linux")] fn test_follow_pipe_f() {