From 72b70a9387e39318bdf4745acff2f3f8a47d604d Mon Sep 17 00:00:00 2001 From: Jacob Greenfield Date: Thu, 25 Sep 2025 19:57:10 -0400 Subject: [PATCH] sort: do not search previously-read characters for newlines --- src/uu/sort/src/chunks.rs | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/uu/sort/src/chunks.rs b/src/uu/sort/src/chunks.rs index b8e9d1b56..af10a0088 100644 --- a/src/uu/sort/src/chunks.rs +++ b/src/uu/sort/src/chunks.rs @@ -260,6 +260,8 @@ fn read_to_buffer( ) -> UResult<(usize, bool)> { let mut read_target = &mut buffer[start_offset..]; let mut last_file_empty = true; + let mut newline_search_offset = 0; + let mut found_newline = false; loop { match file.read(read_target) { Ok(0) => { @@ -278,13 +280,17 @@ fn read_to_buffer( continue; } } - let mut sep_iter = memchr_iter(separator, buffer).rev(); - let last_line_end = sep_iter.next(); - if sep_iter.next().is_some() { - // We read enough lines. - let end = last_line_end.unwrap(); - // We want to include the separator here, because it shouldn't be carried over. - return Ok((end + 1, true)); + + let mut sep_iter = + memchr_iter(separator, &buffer[newline_search_offset..buffer.len()]).rev(); + newline_search_offset = buffer.len(); + if let Some(last_line_end) = sep_iter.next() { + if found_newline || sep_iter.next().is_some() { + // We read enough lines. + // We want to include the separator here, because it shouldn't be carried over. + return Ok((last_line_end + 1, true)); + } + found_newline = true; } // We need to read more lines