base64: Improve read error message (#10512)

Instead of just "Uncategorized error" output:
"base64: read error: Input/output error"
This commit is contained in:
Tuomas Tynkkynen
2026-01-27 19:15:48 +01:00
committed by GitHub
parent adf36f9ad1
commit 2e7cc47631
2 changed files with 17 additions and 23 deletions
+8 -23
View File
@@ -8,7 +8,7 @@
use clap::{Arg, ArgAction, Command};
use std::ffi::OsString;
use std::fs::File;
use std::io::{self, BufRead, BufReader, ErrorKind, Write};
use std::io::{self, BufRead, BufReader, Write};
use std::path::{Path, PathBuf};
use uucore::display::Quotable;
use uucore::encoding::{
@@ -16,7 +16,7 @@ use uucore::encoding::{
SupportsFastDecodeAndEncode, Z85Wrapper,
for_base_common::{BASE32, BASE32HEX, BASE64URL, HEXUPPER_PERMISSIVE},
};
use uucore::error::{FromIo, UResult, USimpleError, UUsageError};
use uucore::error::{FromIo, UResult, USimpleError, UUsageError, strip_errno};
use uucore::format_usage;
use uucore::translate;
@@ -179,7 +179,7 @@ pub fn handle_input<R: BufRead>(input: &mut R, format: Format, config: Config) -
let mut buffered = Vec::new();
input
.read_to_end(&mut buffered)
.map_err(|err| USimpleError::new(1, format_read_error(err.kind())))?;
.map_err(|err| USimpleError::new(1, format_read_error(&err)))?;
if config.decode {
fast_decode::fast_decode_buffer(
buffered,
@@ -556,7 +556,7 @@ pub mod fast_encode {
loop {
let read_buffer = input
.fill_buf()
.map_err(|err| USimpleError::new(1, super::format_read_error(err.kind())))?;
.map_err(|err| USimpleError::new(1, super::format_read_error(&err)))?;
if read_buffer.is_empty() {
break;
}
@@ -823,7 +823,7 @@ pub mod fast_decode {
loop {
let read_buffer = input
.fill_buf()
.map_err(|err| USimpleError::new(1, super::format_read_error(err.kind())))?;
.map_err(|err| USimpleError::new(1, super::format_read_error(&err)))?;
let read_len = read_buffer.len();
if read_len == 0 {
break;
@@ -919,23 +919,8 @@ pub mod fast_decode {
}
}
fn format_read_error(kind: ErrorKind) -> String {
let kind_string = kind.to_string();
// e.g. "is a directory" -> "Is a directory"
let mut kind_string_capitalized = String::with_capacity(kind_string.len());
for (index, ch) in kind_string.char_indices() {
if index == 0 {
for cha in ch.to_uppercase() {
kind_string_capitalized.push(cha);
}
} else {
kind_string_capitalized.push(ch);
}
}
translate!("base-common-read-error", "error" => kind_string_capitalized)
fn format_read_error(error: &io::Error) -> String {
translate!("base-common-read-error", "error" => strip_errno(error))
}
/// Determines if the input buffer contains any padding ('=') ignoring trailing whitespace.
@@ -944,7 +929,7 @@ fn read_and_has_padding<R: std::io::Read>(input: &mut R) -> UResult<(bool, Vec<u
let mut buf = Vec::new();
input
.read_to_end(&mut buf)
.map_err(|err| USimpleError::new(1, format_read_error(err.kind())))?;
.map_err(|err| USimpleError::new(1, format_read_error(&err)))?;
// Treat the stream as padded if any '=' exists (GNU coreutils continues decoding
// even when padding bytes are followed by more data).
+9
View File
@@ -265,3 +265,12 @@ cyBvdmVyIHRoZSBsYXp5IGRvZy4=
// cSpell:enable
);
}
#[test]
#[cfg(all(target_os = "linux", not(target_env = "musl")))]
fn test_read_error() {
new_ucmd!()
.arg("/proc/self/mem")
.fails()
.stderr_is("base64: read error: Input/output error\n");
}