Skip to content

rustup toolchain link with special characters in the toolchain name causes panics #3517

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
majaha opened this issue Oct 26, 2023 · 3 comments · Fixed by #3518
Closed

rustup toolchain link with special characters in the toolchain name causes panics #3517

majaha opened this issue Oct 26, 2023 · 3 comments · Fixed by #3518
Assignees
Labels

Comments

@majaha
Copy link
Contributor

majaha commented Oct 26, 2023

I found that using special characters in the rustup toolchain link command can cause panics:

matt@Matts-PC:~/rust$ rustup toolchain link "foo(bar)" ~/rust/build/host/stage0/
matt@Matts-PC:~/rust$ RUST_BACKTRACE=1 rustup toolchain list
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("unexpected character in pre-release identifier")', src/utils/utils.rs:549:83
stack backtrace:
   0: rust_begin_unwind
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/panicking.rs:575:5
   1: core::panicking::panic_fmt
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/panicking.rs:64:14
   2: core::result::unwrap_failed
             at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/result.rs:1790:5
   3: rustup::utils::utils::toolchain_sort::special_version
   4: rustup::utils::utils::toolchain_sort::toolchain_sort_key
   5: alloc::slice::<impl [T]>::sort_by::{{closure}}
   6: rustup::config::Cfg::list_toolchains
   7: rustup::cli::rustup_mode::toolchain_list
   8: rustup::cli::rustup_mode::main
   9: rustup_init::main
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
matt@Matts-PC:~/rust$

I also got similar results with "foo#bar"

I'd assume the problem is that rustup toolchain link needs to sanitise it's input more thoroughly.

This was tested on rustup 1.26.0 (5af9b9484 2023-04-05)

@rami3l
Copy link
Member

rami3l commented Oct 27, 2023

@majaha Thanks a lot for filing this issue!

Would you mind reproducing it again with RUST_BACKTRACE=full as suggested?

@majaha
Copy link
Contributor Author

majaha commented Oct 28, 2023

Yeah, no problem:

$ rustup toolchain link "foo(bar)" ~/rust/build/host/stage0/
$ RUST_BACKTRACE=full rustup toolchain list
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Error("unexpected character in pre-release identifier")', src/utils/utils.rs:549:83
stack backtrace:
   0:     0x55c6c7478c2c - std::backtrace_rs::backtrace::libunwind::trace::ha271a8a7e1f3d4ef
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5
   1:     0x55c6c7478c2c - std::backtrace_rs::backtrace::trace_unsynchronized::h85739da0352c791a
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x55c6c7478c2c - std::sys_common::backtrace::_print_fmt::hbc6ebcfb2910b329
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/sys_common/backtrace.rs:65:5
   3:     0x55c6c7478c2c - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::he1c117e52d53614f
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/sys_common/backtrace.rs:44:22
   4:     0x55c6c716653e - core::fmt::write::h25eb51b9526b8e0c
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/fmt/mod.rs:1213:17
   5:     0x55c6c744a014 - std::io::Write::write_fmt::ha9edec5fb1621933
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/io/mod.rs:1682:15
   6:     0x55c6c747bb4f - std::sys_common::backtrace::_print::hf8657cd429fc3452
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/sys_common/backtrace.rs:47:5
   7:     0x55c6c747bb4f - std::sys_common::backtrace::print::h41b9b18ed86f86bd
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/sys_common/backtrace.rs:34:9
   8:     0x55c6c747b74f - std::panicking::default_hook::{{closure}}::h22a91871f4454152
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/panicking.rs:267:22
   9:     0x55c6c747b431 - std::panicking::default_hook::h21ddc36de0cd4ae7
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/panicking.rs:286:9
  10:     0x55c6c747c51d - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h6f7e3c94ecc52e2f
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/alloc/src/boxed.rs:2002:9
  11:     0x55c6c747c51d - std::panicking::rust_panic_with_hook::h5059419d6d59b3d0
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/panicking.rs:692:13
  12:     0x55c6c747c2b4 - std::panicking::begin_panic_handler::{{closure}}::h0f383c291cd78343
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/panicking.rs:579:13
  13:     0x55c6c747c21c - std::sys_common::backtrace::__rust_end_short_backtrace::h70ab22f2ad318cdd
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/sys_common/backtrace.rs:137:18
  14:     0x55c6c747c1f1 - rust_begin_unwind
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/std/src/panicking.rs:575:5
  15:     0x55c6c70c8532 - core::panicking::panic_fmt::hd1d46bcde3c61d72
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/panicking.rs:64:14
  16:     0x55c6c70c8992 - core::result::unwrap_failed::h456a23f68607268c
                               at /rustc/9eb3afe9ebe9c7d2b84b71002d44f4a0edac95e0/library/core/src/result.rs:1790:5
  17:     0x55c6c73e49b1 - rustup::utils::utils::toolchain_sort::special_version::hd419ea6dca271f28
  18:     0x55c6c73e4391 - rustup::utils::utils::toolchain_sort::toolchain_sort_key::hab6c2d84bf9d24ee
  19:     0x55c6c73e404c - alloc::slice::<impl [T]>::sort_by::{{closure}}::h26b8a5a5c3a19913
  20:     0x55c6c73e2aff - rustup::config::Cfg::list_toolchains::h1ae262539898d218
  21:     0x55c6c74047de - rustup::cli::rustup_mode::toolchain_list::h23cda12eea14309e
  22:     0x55c6c73f0000 - rustup::cli::rustup_mode::main::h6982c861a7b9cf8f
  23:     0x55c6c70ee37c - rustup_init::main::hfde47befa0e5797c
  24:     0x55c6c70ec4d3 - std::sys_common::backtrace::__rust_begin_short_backtrace::h747e7fed170da8a9
  25:     0x55c6c70eed39 - main
  26:     0x7f0005aedd90 - __libc_start_call_main
                               at ./csu/../sysdeps/nptl/libc_start_call_main.h:58:16
  27:     0x7f0005aede40 - __libc_start_main_impl
                               at ./csu/../csu/libc-start.c:392:3
  28:     0x55c6c70ec40b - <unknown>
  29:                0x0 - <unknown>

@rami3l
Copy link
Member

rami3l commented Oct 28, 2023

@majaha Thanks! The cause of this issue is the following hack:

pub(crate) fn toolchain_sort(v: &mut [ToolchainName]) {
use semver::{BuildMetadata, Prerelease, Version};
fn special_version(ord: u64, s: &str) -> Version {
Version {
major: 0,
minor: 0,
patch: 0,
pre: Prerelease::new(&format!("pre.{}.{}", ord, s.replace('_', "-"))).unwrap(),
build: BuildMetadata::EMPTY,
}
}
fn toolchain_sort_key(s: &str) -> Version {
if s.starts_with("stable") {
special_version(0, s)
} else if s.starts_with("beta") {
special_version(1, s)
} else if s.starts_with("nightly") {
special_version(2, s)
} else {
Version::parse(&s.replace('_', "-")).unwrap_or_else(|_| special_version(3, s))
}
}
v.sort_by(|a, b| {
let a_str = &format!("{a}");
let b_str = &format!("{b}");
let a_key = toolchain_sort_key(a_str);
let b_key = toolchain_sort_key(b_str);
a_key.cmp(&b_key)
});
}

I'll claim this and fix it soon. Stay tuned!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants