From 817a832f33c96842c81f4aa8255780e944539a14 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 8 Mar 2023 13:55:45 +0100 Subject: [PATCH 1/5] Bump clap from 4.0.26 to 4.1.8 --- Cargo.lock | 17 +++-------------- Cargo.toml | 2 +- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e4f489eae..69787b731 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -61,17 +61,6 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -236,13 +225,13 @@ dependencies = [ [[package]] name = "clap" -version = "4.0.26" +version = "4.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2148adefda54e14492fb9bddcc600b4344c5d1a3123bd666dcb939c6f0e0e57e" +checksum = "c3d7ae14b20b94cb02149ed21a86c423859cbe18dc7ed69845cace50e52b40a5" dependencies = [ - "atty", "bitflags", "clap_lex", + "is-terminal", "once_cell", "strsim", "termcolor", diff --git a/Cargo.toml b/Cargo.toml index d8d43b252..68542b02a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -269,7 +269,7 @@ bstr = "1.0" bytecount = "0.6.3" byteorder = "1.3.2" chrono = { version="^0.4.23", default-features=false, features=["std", "alloc", "clock"]} -clap = { version = "4.0", features = ["wrap_help", "cargo"] } +clap = { version = "4.1", features = ["wrap_help", "cargo"] } clap_complete = "4.0" clap_mangen = "0.2" compare = "0.1.0" From 3eeb5dda308f244ab6ec7cd9b9c477a0c18b39c3 Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Wed, 8 Mar 2023 15:06:07 +0100 Subject: [PATCH 2/5] tests: adapt to clap's modified error messages --- tests/by-util/test_base32.rs | 2 +- tests/by-util/test_base64.rs | 2 +- tests/by-util/test_chgrp.rs | 2 +- tests/by-util/test_chroot.rs | 2 +- tests/by-util/test_cp.rs | 2 +- tests/by-util/test_link.rs | 4 ++-- tests/by-util/test_mknod.rs | 6 +++--- tests/by-util/test_seq.rs | 10 ++-------- tests/by-util/test_sort.rs | 2 +- tests/by-util/test_stdbuf.rs | 2 +- tests/by-util/test_truncate.rs | 2 +- tests/by-util/test_tsort.rs | 4 +--- tests/by-util/test_who.rs | 2 +- 13 files changed, 17 insertions(+), 25 deletions(-) diff --git a/tests/by-util/test_base32.rs b/tests/by-util/test_base32.rs index 0634d114e..19f7515d2 100644 --- a/tests/by-util/test_base32.rs +++ b/tests/by-util/test_base32.rs @@ -86,7 +86,7 @@ fn test_wrap() { fn test_wrap_no_arg() { for wrap_param in ["-w", "--wrap"] { let ts = TestScenario::new(util_name!()); - let expected_stderr = "The argument '--wrap ' requires a value but none was supplied"; + let expected_stderr = "a value is required for '--wrap ' but none was supplied"; ts.ucmd() .arg(wrap_param) .fails() diff --git a/tests/by-util/test_base64.rs b/tests/by-util/test_base64.rs index 6a2563b10..9d551b321 100644 --- a/tests/by-util/test_base64.rs +++ b/tests/by-util/test_base64.rs @@ -79,7 +79,7 @@ fn test_wrap_no_arg() { new_ucmd!() .arg(wrap_param) .fails() - .stderr_contains("The argument '--wrap ' requires a value but none was supplied") + .stderr_contains("a value is required for '--wrap ' but none was supplied") .no_stdout(); } } diff --git a/tests/by-util/test_chgrp.rs b/tests/by-util/test_chgrp.rs index 352ecb513..f7b298c79 100644 --- a/tests/by-util/test_chgrp.rs +++ b/tests/by-util/test_chgrp.rs @@ -196,7 +196,7 @@ fn test_missing_files() { .arg("groupname") .fails() .stderr_contains( - "error: The following required arguments were not provided:\n ...\n", + "error: the following required arguments were not provided:\n ...\n", ); } diff --git a/tests/by-util/test_chroot.rs b/tests/by-util/test_chroot.rs index 0e3468720..b1e270577 100644 --- a/tests/by-util/test_chroot.rs +++ b/tests/by-util/test_chroot.rs @@ -15,7 +15,7 @@ fn test_missing_operand() { assert!(result .stderr_str() - .starts_with("error: The following required arguments were not provided")); + .starts_with("error: the following required arguments were not provided")); assert!(result.stderr_str().contains("")); } diff --git a/tests/by-util/test_cp.rs b/tests/by-util/test_cp.rs index a514ce04a..188d5db63 100644 --- a/tests/by-util/test_cp.rs +++ b/tests/by-util/test_cp.rs @@ -1495,7 +1495,7 @@ fn test_cp_reflink_bad() { .arg(TEST_HELLO_WORLD_SOURCE) .arg(TEST_EXISTING_FILE) .fails() - .stderr_contains("error: 'bad' isn't a valid value for '--reflink[=]'"); + .stderr_contains("error: invalid value 'bad' for '--reflink[=]'"); } #[test] diff --git a/tests/by-util/test_link.rs b/tests/by-util/test_link.rs index e52a31a33..c147fdf6c 100644 --- a/tests/by-util/test_link.rs +++ b/tests/by-util/test_link.rs @@ -52,7 +52,7 @@ fn test_link_one_argument() { let file = "test_link_argument"; ucmd.args(&[file]) .fails() - .stderr_contains("requires 2 values"); + .stderr_contains("2 values required"); } #[test] @@ -65,5 +65,5 @@ fn test_link_three_arguments() { ]; ucmd.args(&arguments[..]) .fails() - .stderr_contains("requires 2 values"); + .stderr_contains("2 values required"); } diff --git a/tests/by-util/test_mknod.rs b/tests/by-util/test_mknod.rs index c6d15e204..d2f4032c4 100644 --- a/tests/by-util/test_mknod.rs +++ b/tests/by-util/test_mknod.rs @@ -92,14 +92,14 @@ fn test_mknod_character_device_requires_major_and_minor() { .arg("1") .arg("c") .fails() - .stderr_contains("Invalid value 'c'"); + .stderr_contains("invalid value 'c'"); new_ucmd!() .arg("test_file") .arg("c") .arg("c") .arg("1") .fails() - .stderr_contains("Invalid value 'c'"); + .stderr_contains("invalid value 'c'"); } #[test] @@ -109,7 +109,7 @@ fn test_mknod_invalid_arg() { .arg("--foo") .fails() .no_stdout() - .stderr_contains("Found argument '--foo' which wasn't expected"); + .stderr_contains("unexpected argument '--foo' found"); } #[test] diff --git a/tests/by-util/test_seq.rs b/tests/by-util/test_seq.rs index fa73b2937..2d55ed8ce 100644 --- a/tests/by-util/test_seq.rs +++ b/tests/by-util/test_seq.rs @@ -36,18 +36,12 @@ fn test_hex_rejects_sign_after_identifier() { .args(&["-0x-123ABC"]) .fails() .no_stdout() - .stderr_contains( - "Found argument '-0' which wasn't expected, or isn't valid in this context", - ) - .stderr_contains("For more information try '--help'"); + .stderr_contains("unexpected argument '-0' found"); new_ucmd!() .args(&["-0x+123ABC"]) .fails() .no_stdout() - .stderr_contains( - "Found argument '-0' which wasn't expected, or isn't valid in this context", - ) - .stderr_contains("For more information try '--help'"); + .stderr_contains("unexpected argument '-0' found"); } #[test] diff --git a/tests/by-util/test_sort.rs b/tests/by-util/test_sort.rs index 174ac255c..f2d0cd5ce 100644 --- a/tests/by-util/test_sort.rs +++ b/tests/by-util/test_sort.rs @@ -999,7 +999,7 @@ fn test_conflict_check_out() { .fails() .stderr_contains( // the rest of the message might be subject to change - "error: The argument", + "error: the argument", ); } } diff --git a/tests/by-util/test_stdbuf.rs b/tests/by-util/test_stdbuf.rs index b4aa64040..286cb7c24 100644 --- a/tests/by-util/test_stdbuf.rs +++ b/tests/by-util/test_stdbuf.rs @@ -30,7 +30,7 @@ fn test_stdbuf_no_buffer_option_fails() { ts.ucmd() .args(&["head"]) .fails() - .stderr_contains("The following required arguments were not provided:"); + .stderr_contains("the following required arguments were not provided:"); } #[cfg(not(target_os = "windows"))] diff --git a/tests/by-util/test_truncate.rs b/tests/by-util/test_truncate.rs index f306a32a9..e94ee13a7 100644 --- a/tests/by-util/test_truncate.rs +++ b/tests/by-util/test_truncate.rs @@ -194,7 +194,7 @@ fn test_error_filename_only() { .args(&["file"]) .fails() .code_is(1) - .stderr_contains("error: The following required arguments were not provided:"); + .stderr_contains("error: the following required arguments were not provided:"); } #[test] diff --git a/tests/by-util/test_tsort.rs b/tests/by-util/test_tsort.rs index e424fe651..16bfee461 100644 --- a/tests/by-util/test_tsort.rs +++ b/tests/by-util/test_tsort.rs @@ -50,7 +50,5 @@ fn test_multiple_arguments() { .arg("call_graph.txt") .arg("invalid_file") .fails() - .stderr_contains( - "Found argument 'invalid_file' which wasn't expected, or isn't valid in this context", - ); + .stderr_contains("unexpected argument 'invalid_file' found"); } diff --git a/tests/by-util/test_who.rs b/tests/by-util/test_who.rs index 6f98c8b9d..d5ad05d97 100644 --- a/tests/by-util/test_who.rs +++ b/tests/by-util/test_who.rs @@ -151,7 +151,7 @@ fn test_arg1_arg2() { #[test] fn test_too_many_args() { const EXPECTED: &str = - "error: The value 'u' was provided to '[FILE]...' but it wasn't expecting any more values"; + "error: unexpected value 'u' for '[FILE]...' found; no more were expected"; let args = ["am", "i", "u"]; new_ucmd!().args(&args).fails().stderr_contains(EXPECTED); From b8d9552ef58efb9586fd252437c557b22f51d33f Mon Sep 17 00:00:00 2001 From: Miles Liu Date: Fri, 10 Mar 2023 16:35:20 +0800 Subject: [PATCH 3/5] shred: fix `permissions_set_readonly_false` clippy error --- src/uu/shred/src/shred.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/uu/shred/src/shred.rs b/src/uu/shred/src/shred.rs index 55a36bfe2..75967a3dd 100644 --- a/src/uu/shred/src/shred.rs +++ b/src/uu/shred/src/shred.rs @@ -16,9 +16,13 @@ use std::fs; use std::fs::{File, OpenOptions}; use std::io; use std::io::prelude::*; +#[cfg(unix)] +use std::os::unix::fs::PermissionsExt; use std::path::{Path, PathBuf}; use uucore::display::Quotable; use uucore::error::{FromIo, UResult, USimpleError, UUsageError}; +#[cfg(unix)] +use uucore::libc::S_IWUSR; use uucore::{format_usage, show, show_if_err, util_name}; const BLOCK_SIZE: usize = 512; @@ -462,6 +466,18 @@ fn wipe_file( if force { let metadata = fs::metadata(path).map_err_context(String::new)?; let mut perms = metadata.permissions(); + #[cfg(unix)] + #[allow(clippy::useless_conversion)] + { + // NOTE: set_readonly(false) makes the file world-writable on Unix. + // NOTE: S_IWUSR type is u16 on macOS. + if (perms.mode() & u32::from(S_IWUSR)) == 0 { + perms.set_mode(u32::from(S_IWUSR)); + } + } + #[cfg(not(unix))] + // TODO: Remove the following once https://github.com/rust-lang/rust-clippy/issues/10477 is resolved. + #[allow(clippy::permissions_set_readonly_false)] perms.set_readonly(false); fs::set_permissions(path, perms).map_err_context(String::new)?; } From d80afe7beb012cbb0e71bf15d495eebacff91a0a Mon Sep 17 00:00:00 2001 From: Daniel Hofstetter Date: Sat, 11 Mar 2023 15:57:10 +0100 Subject: [PATCH 4/5] Bump rayon from 1.6.0 to 1.7.0 --- Cargo.lock | 9 ++++----- Cargo.toml | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 38aaa1385..a74f1f28a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1808,20 +1808,19 @@ dependencies = [ [[package]] name = "rayon" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e060280438193c554f654141c9ea9417886713b7acd75974c85b18a69a88e0b" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" dependencies = [ - "crossbeam-deque", "either", "rayon-core", ] [[package]] name = "rayon-core" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cac410af5d00ab6884528b4ab69d1e8e146e8d471201800fa1b4524126de6ad3" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ "crossbeam-channel", "crossbeam-deque", diff --git a/Cargo.toml b/Cargo.toml index 822f30f76..c73025614 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -308,7 +308,7 @@ platform-info = "1.0.2" quick-error = "2.0.1" rand = { version = "0.8", features = ["small_rng"] } rand_core = "0.6" -rayon = "1.5" +rayon = "1.7" redox_syscall = "0.2" regex = "1.7.1" rust-ini = "0.18.0" From e5b6f63305c4fa23ef5837309a8a4e7e911576ba Mon Sep 17 00:00:00 2001 From: papparapa <37232476+papparapa@users.noreply.github.com> Date: Sun, 12 Mar 2023 19:07:59 +0900 Subject: [PATCH 5/5] parser: fix index out of bounds error (#4484) + revert 1bc9980 to use files in workspace --- fuzz/Cargo.toml | 4 ++-- src/uucore/src/lib/parser/parse_glob.rs | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/fuzz/Cargo.toml b/fuzz/Cargo.toml index 89c6bc4ef..c8565d691 100644 --- a/fuzz/Cargo.toml +++ b/fuzz/Cargo.toml @@ -11,10 +11,10 @@ cargo-fuzz = true libfuzzer-sys = "0.4" [dependencies.uucore] -uucore = { workspace = true } +path = "../src/uucore/" [dependencies.uu_date] -uu_date = { workspace = true } +path = "../src/uu/date/" # Prevent this from interfering with workspaces [workspace] diff --git a/src/uucore/src/lib/parser/parse_glob.rs b/src/uucore/src/lib/parser/parse_glob.rs index 8605f7450..a321d470b 100644 --- a/src/uucore/src/lib/parser/parse_glob.rs +++ b/src/uucore/src/lib/parser/parse_glob.rs @@ -10,8 +10,9 @@ fn fix_negation(glob: &str) -> String { let mut chars = glob.chars().collect::>(); let mut i = 0; - while i < chars.len() { - if chars[i] == '[' && i + 4 <= glob.len() && chars[i + 1] == '^' { + // Add 3 to prevent out of bounds in loop + while i + 3 < chars.len() { + if chars[i] == '[' && chars[i + 1] == '^' { match chars[i + 3..].iter().position(|x| *x == ']') { None => (), Some(j) => { @@ -105,5 +106,8 @@ mod tests { assert_eq!(fix_negation("[^]"), "[^]"); assert_eq!(fix_negation("[^"), "[^"); assert_eq!(fix_negation("[][^]"), "[][^]"); + + // Issue #4479 + assert_eq!(fix_negation("ààà[^"), "ààà[^"); } }