From 951c8b5efb1f4edbddb217b46e66c4a1ae2baed5 Mon Sep 17 00:00:00 2001 From: vibhuthespeedst Date: Mon, 26 Oct 2026 08:08:35 +0530 Subject: [PATCH] basenc: decode --base58 input in one piece Base58 text is one big number, but the decoder flushed every 1024 digits, so longer input decoded to the wrong bytes and basenc could not read back its own output. Fixes #15776 --- src/uu/base32/src/base_common.rs | 10 ++-------- tests/by-util/test_basenc.rs | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/uu/base32/src/base_common.rs b/src/uu/base32/src/base_common.rs index 658debbf85c..0519f2ee0b1 100644 --- a/src/uu/base32/src/base_common.rs +++ b/src/uu/base32/src/base_common.rs @@ -752,6 +752,8 @@ pub mod fast_decode { )); } + // Encodings without partial decode (base58) are one big number, so + // they are decoded in one go after the loop, never in chunks. if supports_partial_decode { flush_ready_chunks( &mut buffer, @@ -761,14 +763,6 @@ pub mod fast_decode { &mut decoded_buffer, output, )?; - } else if buffer.len() == decode_in_chunks_of_size { - decode_in_chunks_to_buffer( - supports_fast_decode_and_encode, - &buffer, - &mut decoded_buffer, - )?; - write_to_output(&mut decoded_buffer, output)?; - buffer.clear(); } } diff --git a/tests/by-util/test_basenc.rs b/tests/by-util/test_basenc.rs index d57a2e69445..61f292d2e40 100644 --- a/tests/by-util/test_basenc.rs +++ b/tests/by-util/test_basenc.rs @@ -184,6 +184,26 @@ fn test_base58_large_file_no_chunking() { // spell-checker:enable } +#[test] +fn test_base58_decode_large_input_round_trip() { + // Decoding must not cut the input into 1024-digit chunks either. + // spell-checker:disable + let input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. ".repeat(50); + // spell-checker:enable + let encoded = new_ucmd!() + .arg("--base58") + .pipe_in(input.clone()) + .succeeds() + .stdout_move_str(); + assert!(encoded.len() > 1024); + + new_ucmd!() + .args(&["--base58", "-d"]) + .pipe_in(encoded) + .succeeds() + .stdout_is(input); +} + #[test] fn test_choose_last_encoding_base64() { new_ucmd!()