diff --git a/.gitignore b/.gitignore index 2307804..2e090d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -SOURCES/rustc-1.66.1-src.tar.xz -SOURCES/wasi-libc-wasi-sdk-17.tar.gz +SOURCES/rustc-1.71.1-src.tar.xz +SOURCES/wasi-libc-wasi-sdk-20.tar.gz diff --git a/.rust.metadata b/.rust.metadata index ab349ab..7213a20 100644 --- a/.rust.metadata +++ b/.rust.metadata @@ -1,2 +1,2 @@ -a8cc02cc11a942bddf67f1cfdcdd2bd867296f8e SOURCES/rustc-1.66.1-src.tar.xz -1f4561760c6c7e9f9f30c8cf0d156b8d551e04e2 SOURCES/wasi-libc-wasi-sdk-17.tar.gz +ffa03139b447604322d689eefe4e157a49c39f51 SOURCES/rustc-1.71.1-src.tar.xz +8678e3510c88ef1de4d8c2940fa8ddad8f4eb084 SOURCES/wasi-libc-wasi-sdk-20.tar.gz diff --git a/SOURCES/0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch b/SOURCES/0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch new file mode 100644 index 0000000..2b1ecb5 --- /dev/null +++ b/SOURCES/0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch @@ -0,0 +1,142 @@ +From f2fd2d01f96b50b039402c9ab4278230687f7922 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Tue, 25 Jul 2023 13:11:50 -0700 +Subject: [PATCH] Allow using external builds of the compiler-rt profile lib + +This changes the bootstrap config `target.*.profiler` from a plain bool +to also allow a string, which will be used as a path to the pre-built +profiling runtime for that target. Then `profiler_builtins/build.rs` +reads that in a `LLVM_PROFILER_RT_LIB` environment variable. +--- + config.example.toml | 6 ++++-- + library/profiler_builtins/build.rs | 6 ++++++ + src/bootstrap/compile.rs | 4 ++++ + src/bootstrap/config.rs | 30 ++++++++++++++++++++++++------ + 4 files changed, 38 insertions(+), 8 deletions(-) + +diff --git a/config.example.toml b/config.example.toml +index d0eaa9fd7ffa..e0e991e679af 100644 +--- a/config.example.toml ++++ b/config.example.toml +@@ -745,8 +745,10 @@ changelog-seen = 2 + # This option will override the same option under [build] section. + #sanitizers = build.sanitizers (bool) + +-# Build the profiler runtime for this target(required when compiling with options that depend +-# on this runtime, such as `-C profile-generate` or `-C instrument-coverage`). ++# When true, build the profiler runtime for this target(required when compiling ++# with options that depend on this runtime, such as `-C profile-generate` or ++# `-C instrument-coverage`). This may also be given a path to an existing build ++# of the profiling runtime library from LLVM's compiler-rt. + # This option will override the same option under [build] section. + #profiler = build.profiler (bool) + +diff --git a/library/profiler_builtins/build.rs b/library/profiler_builtins/build.rs +index 1b1f11798d74..d14d0b82229a 100644 +--- a/library/profiler_builtins/build.rs ++++ b/library/profiler_builtins/build.rs +@@ -6,6 +6,12 @@ + use std::path::Path; + + fn main() { ++ println!("cargo:rerun-if-env-changed=LLVM_PROFILER_RT_LIB"); ++ if let Ok(rt) = env::var("LLVM_PROFILER_RT_LIB") { ++ println!("cargo:rustc-link-lib=static:+verbatim={rt}"); ++ return; ++ } ++ + let target = env::var("TARGET").expect("TARGET was not set"); + let cfg = &mut cc::Build::new(); + +diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs +index 33addb90da37..1d8b3c6e5435 100644 +--- a/src/bootstrap/compile.rs ++++ b/src/bootstrap/compile.rs +@@ -305,6 +305,10 @@ pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, stage: u32, car + cargo.env("MACOSX_DEPLOYMENT_TARGET", target); + } + ++ if let Some(path) = builder.config.profiler_path(target) { ++ cargo.env("LLVM_PROFILER_RT_LIB", path); ++ } ++ + // Determine if we're going to compile in optimized C intrinsics to + // the `compiler-builtins` crate. These intrinsics live in LLVM's + // `compiler-rt` repository, but our `src/llvm-project` submodule isn't +diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs +index e192cda9a9a7..a4803db0a470 100644 +--- a/src/bootstrap/config.rs ++++ b/src/bootstrap/config.rs +@@ -467,7 +467,7 @@ pub struct Target { + pub linker: Option, + pub ndk: Option, + pub sanitizers: Option, +- pub profiler: Option, ++ pub profiler: Option, + pub rpath: Option, + pub crt_static: Option, + pub musl_root: Option, +@@ -796,9 +796,9 @@ struct Dist { + } + } + +-#[derive(Debug, Deserialize)] ++#[derive(Clone, Debug, Deserialize)] + #[serde(untagged)] +-enum StringOrBool { ++pub enum StringOrBool { + String(String), + Bool(bool), + } +@@ -809,6 +809,12 @@ fn default() -> StringOrBool { + } + } + ++impl StringOrBool { ++ fn is_string_or_true(&self) -> bool { ++ matches!(self, Self::String(_) | Self::Bool(true)) ++ } ++} ++ + define_config! { + /// TOML representation of how the Rust build is configured. + struct Rust { +@@ -880,7 +886,7 @@ struct TomlTarget { + llvm_libunwind: Option = "llvm-libunwind", + android_ndk: Option = "android-ndk", + sanitizers: Option = "sanitizers", +- profiler: Option = "profiler", ++ profiler: Option = "profiler", + rpath: Option = "rpath", + crt_static: Option = "crt-static", + musl_root: Option = "musl-root", +@@ -1744,12 +1750,24 @@ pub fn any_sanitizers_enabled(&self) -> bool { + self.target_config.values().any(|t| t.sanitizers == Some(true)) || self.sanitizers + } + ++ pub fn profiler_path(&self, target: TargetSelection) -> Option<&str> { ++ match self.target_config.get(&target)?.profiler.as_ref()? { ++ StringOrBool::String(s) => Some(s), ++ StringOrBool::Bool(_) => None, ++ } ++ } ++ + pub fn profiler_enabled(&self, target: TargetSelection) -> bool { +- self.target_config.get(&target).map(|t| t.profiler).flatten().unwrap_or(self.profiler) ++ self.target_config ++ .get(&target) ++ .and_then(|t| t.profiler.as_ref()) ++ .map(StringOrBool::is_string_or_true) ++ .unwrap_or(self.profiler) + } + + pub fn any_profiler_enabled(&self) -> bool { +- self.target_config.values().any(|t| t.profiler == Some(true)) || self.profiler ++ self.target_config.values().any(|t| matches!(&t.profiler, Some(p) if p.is_string_or_true())) ++ || self.profiler + } + + pub fn rpath_enabled(&self, target: TargetSelection) -> bool { +-- +2.41.0 + diff --git a/SOURCES/0001-Improve-generating-Custom-entry-function.patch b/SOURCES/0001-Improve-generating-Custom-entry-function.patch deleted file mode 100644 index 77cb30e..0000000 --- a/SOURCES/0001-Improve-generating-Custom-entry-function.patch +++ /dev/null @@ -1,302 +0,0 @@ -From 9f0a8620bd7d325e6d42417b08daff3e55cb88f6 Mon Sep 17 00:00:00 2001 -From: Ayush Singh -Date: Sat, 5 Nov 2022 14:36:38 +0530 -Subject: [PATCH] Improve generating Custom entry function - -This commit is aimed at making compiler generated entry functions -(Basically just C `main` right now) more generic so other targets can do -similar things for custom entry. This was initially implemented as part -of https://github.com/rust-lang/rust/pull/100316. - -Currently, this moves the entry function name and Call convention to the -target spec. - -Signed-off-by: Ayush Singh ---- - compiler/rustc_codegen_llvm/src/abi.rs | 40 +++++++++++-------- - compiler/rustc_codegen_llvm/src/context.rs | 10 ++++- - compiler/rustc_codegen_llvm/src/declare.rs | 22 ++++++++++ - .../src/back/symbol_export.rs | 3 +- - compiler/rustc_target/src/abi/call/mod.rs | 28 +++++++++++++ - compiler/rustc_target/src/json.rs | 25 ++++++++++++ - compiler/rustc_target/src/spec/mod.rs | 27 +++++++++++++ - 7 files changed, 135 insertions(+), 20 deletions(-) - -diff --git a/compiler/rustc_codegen_llvm/src/abi.rs b/compiler/rustc_codegen_llvm/src/abi.rs -index d478efc863a9..a6fd2a7de6bd 100644 ---- a/compiler/rustc_codegen_llvm/src/abi.rs -+++ b/compiler/rustc_codegen_llvm/src/abi.rs -@@ -398,23 +398,7 @@ fn ptr_to_llvm_type(&self, cx: &CodegenCx<'ll, 'tcx>) -> &'ll Type { - } - - fn llvm_cconv(&self) -> llvm::CallConv { -- match self.conv { -- Conv::C | Conv::Rust | Conv::CCmseNonSecureCall => llvm::CCallConv, -- Conv::RustCold => llvm::ColdCallConv, -- Conv::AmdGpuKernel => llvm::AmdGpuKernel, -- Conv::AvrInterrupt => llvm::AvrInterrupt, -- Conv::AvrNonBlockingInterrupt => llvm::AvrNonBlockingInterrupt, -- Conv::ArmAapcs => llvm::ArmAapcsCallConv, -- Conv::Msp430Intr => llvm::Msp430Intr, -- Conv::PtxKernel => llvm::PtxKernel, -- Conv::X86Fastcall => llvm::X86FastcallCallConv, -- Conv::X86Intr => llvm::X86_Intr, -- Conv::X86Stdcall => llvm::X86StdcallCallConv, -- Conv::X86ThisCall => llvm::X86_ThisCall, -- Conv::X86VectorCall => llvm::X86_VectorCall, -- Conv::X86_64SysV => llvm::X86_64_SysV, -- Conv::X86_64Win64 => llvm::X86_64_Win64, -- } -+ self.conv.into() - } - - fn apply_attrs_llfn(&self, cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value) { -@@ -596,3 +580,25 @@ fn get_param(&mut self, index: usize) -> Self::Value { - llvm::get_param(self.llfn(), index as c_uint) - } - } -+ -+impl From for llvm::CallConv { -+ fn from(conv: Conv) -> Self { -+ match conv { -+ Conv::C | Conv::Rust | Conv::CCmseNonSecureCall => llvm::CCallConv, -+ Conv::RustCold => llvm::ColdCallConv, -+ Conv::AmdGpuKernel => llvm::AmdGpuKernel, -+ Conv::AvrInterrupt => llvm::AvrInterrupt, -+ Conv::AvrNonBlockingInterrupt => llvm::AvrNonBlockingInterrupt, -+ Conv::ArmAapcs => llvm::ArmAapcsCallConv, -+ Conv::Msp430Intr => llvm::Msp430Intr, -+ Conv::PtxKernel => llvm::PtxKernel, -+ Conv::X86Fastcall => llvm::X86FastcallCallConv, -+ Conv::X86Intr => llvm::X86_Intr, -+ Conv::X86Stdcall => llvm::X86StdcallCallConv, -+ Conv::X86ThisCall => llvm::X86_ThisCall, -+ Conv::X86VectorCall => llvm::X86_VectorCall, -+ Conv::X86_64SysV => llvm::X86_64_SysV, -+ Conv::X86_64Win64 => llvm::X86_64_Win64, -+ } -+ } -+} -diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs -index 79ddfd884dfa..f3ef618fff54 100644 ---- a/compiler/rustc_codegen_llvm/src/context.rs -+++ b/compiler/rustc_codegen_llvm/src/context.rs -@@ -570,8 +570,14 @@ fn apply_target_cpu_attr(&self, llfn: &'ll Value) { - } - - fn declare_c_main(&self, fn_type: Self::Type) -> Option { -- if self.get_declared_value("main").is_none() { -- Some(self.declare_cfn("main", llvm::UnnamedAddr::Global, fn_type)) -+ let entry_name = self.sess().target.entry_name.as_ref(); -+ if self.get_declared_value(entry_name).is_none() { -+ Some(self.declare_entry_fn( -+ entry_name, -+ self.sess().target.entry_abi.into(), -+ llvm::UnnamedAddr::Global, -+ fn_type, -+ )) - } else { - // If the symbol already exists, it is an error: for example, the user wrote - // #[no_mangle] extern "C" fn main(..) {..} -diff --git a/compiler/rustc_codegen_llvm/src/declare.rs b/compiler/rustc_codegen_llvm/src/declare.rs -index f79ef11720df..dc21a02cec44 100644 ---- a/compiler/rustc_codegen_llvm/src/declare.rs -+++ b/compiler/rustc_codegen_llvm/src/declare.rs -@@ -90,6 +90,28 @@ pub fn declare_cfn( - declare_raw_fn(self, name, llvm::CCallConv, unnamed, visibility, fn_type) - } - -+ /// Declare an entry Function -+ /// -+ /// The ABI of this function can change depending on the target (although for now the same as -+ /// `declare_cfn`) -+ /// -+ /// If there’s a value with the same name already declared, the function will -+ /// update the declaration and return existing Value instead. -+ pub fn declare_entry_fn( -+ &self, -+ name: &str, -+ callconv: llvm::CallConv, -+ unnamed: llvm::UnnamedAddr, -+ fn_type: &'ll Type, -+ ) -> &'ll Value { -+ let visibility = if self.tcx.sess.target.default_hidden_visibility { -+ llvm::Visibility::Hidden -+ } else { -+ llvm::Visibility::Default -+ }; -+ declare_raw_fn(self, name, callconv, unnamed, visibility, fn_type) -+ } -+ - /// Declare a Rust function. - /// - /// If there’s a value with the same name already declared, the function will -diff --git a/compiler/rustc_codegen_ssa/src/back/symbol_export.rs b/compiler/rustc_codegen_ssa/src/back/symbol_export.rs -index 752f6b1ef40c..22f534d909ab 100644 ---- a/compiler/rustc_codegen_ssa/src/back/symbol_export.rs -+++ b/compiler/rustc_codegen_ssa/src/back/symbol_export.rs -@@ -180,7 +180,8 @@ fn exported_symbols_provider_local<'tcx>( - .collect(); - - if tcx.entry_fn(()).is_some() { -- let exported_symbol = ExportedSymbol::NoDefId(SymbolName::new(tcx, "main")); -+ let exported_symbol = -+ ExportedSymbol::NoDefId(SymbolName::new(tcx, tcx.sess.target.entry_name.as_ref())); - - symbols.push(( - exported_symbol, -diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs -index 9e5f0e4d158b..c622bd36b00c 100644 ---- a/compiler/rustc_target/src/abi/call/mod.rs -+++ b/compiler/rustc_target/src/abi/call/mod.rs -@@ -3,6 +3,7 @@ - use crate::spec::{self, HasTargetSpec}; - use rustc_span::Symbol; - use std::fmt; -+use std::str::FromStr; - - mod aarch64; - mod amdgpu; -@@ -735,6 +736,33 @@ pub fn adjust_for_foreign_abi( - } - } - -+impl FromStr for Conv { -+ type Err = String; -+ -+ fn from_str(s: &str) -> Result { -+ match s { -+ "C" => Ok(Conv::C), -+ "Rust" => Ok(Conv::Rust), -+ "RustCold" => Ok(Conv::Rust), -+ "ArmAapcs" => Ok(Conv::ArmAapcs), -+ "CCmseNonSecureCall" => Ok(Conv::CCmseNonSecureCall), -+ "Msp430Intr" => Ok(Conv::Msp430Intr), -+ "PtxKernel" => Ok(Conv::PtxKernel), -+ "X86Fastcall" => Ok(Conv::X86Fastcall), -+ "X86Intr" => Ok(Conv::X86Intr), -+ "X86Stdcall" => Ok(Conv::X86Stdcall), -+ "X86ThisCall" => Ok(Conv::X86ThisCall), -+ "X86VectorCall" => Ok(Conv::X86VectorCall), -+ "X86_64SysV" => Ok(Conv::X86_64SysV), -+ "X86_64Win64" => Ok(Conv::X86_64Win64), -+ "AmdGpuKernel" => Ok(Conv::AmdGpuKernel), -+ "AvrInterrupt" => Ok(Conv::AvrInterrupt), -+ "AvrNonBlockingInterrupt" => Ok(Conv::AvrNonBlockingInterrupt), -+ _ => Err(format!("'{}' is not a valid value for entry function call convetion.", s)), -+ } -+ } -+} -+ - // Some types are used a lot. Make sure they don't unintentionally get bigger. - #[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] - mod size_asserts { -diff --git a/compiler/rustc_target/src/json.rs b/compiler/rustc_target/src/json.rs -index b5d926352122..75bb76a9de08 100644 ---- a/compiler/rustc_target/src/json.rs -+++ b/compiler/rustc_target/src/json.rs -@@ -89,3 +89,28 @@ fn to_json(&self) -> Json { - } - } - } -+ -+impl ToJson for crate::abi::call::Conv { -+ fn to_json(&self) -> Json { -+ let s = match self { -+ Self::C => "C", -+ Self::Rust => "Rust", -+ Self::RustCold => "RustCold", -+ Self::ArmAapcs => "ArmAapcs", -+ Self::CCmseNonSecureCall => "CCmseNonSecureCall", -+ Self::Msp430Intr => "Msp430Intr", -+ Self::PtxKernel => "PtxKernel", -+ Self::X86Fastcall => "X86Fastcall", -+ Self::X86Intr => "X86Intr", -+ Self::X86Stdcall => "X86Stdcall", -+ Self::X86ThisCall => "X86ThisCall", -+ Self::X86VectorCall => "X86VectorCall", -+ Self::X86_64SysV => "X86_64SysV", -+ Self::X86_64Win64 => "X86_64Win64", -+ Self::AmdGpuKernel => "AmdGpuKernel", -+ Self::AvrInterrupt => "AvrInterrupt", -+ Self::AvrNonBlockingInterrupt => "AvrNonBlockingInterrupt", -+ }; -+ Json::String(s.to_owned()) -+ } -+} -diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs -index 72b088d663b1..617de46a55aa 100644 ---- a/compiler/rustc_target/src/spec/mod.rs -+++ b/compiler/rustc_target/src/spec/mod.rs -@@ -34,6 +34,7 @@ - //! the target's settings, though `target-feature` and `link-args` will *add* - //! to the list specified by the target, rather than replace. - -+use crate::abi::call::Conv; - use crate::abi::Endian; - use crate::json::{Json, ToJson}; - use crate::spec::abi::{lookup as lookup_abi, Abi}; -@@ -1668,6 +1669,14 @@ pub struct TargetOptions { - /// Whether the target supports stack canary checks. `true` by default, - /// since this is most common among tier 1 and tier 2 targets. - pub supports_stack_protector: bool, -+ -+ // The name of entry function. -+ // Default value is "main" -+ pub entry_name: StaticCow, -+ -+ // The ABI of entry function. -+ // Default value is `Conv::C`, i.e. C call convention -+ pub entry_abi: Conv, - } - - /// Add arguments for the given flavor and also for its "twin" flavors -@@ -1884,6 +1893,8 @@ fn default() -> TargetOptions { - c_enum_min_bits: 32, - generate_arange_section: true, - supports_stack_protector: true, -+ entry_name: "main".into(), -+ entry_abi: Conv::C, - } - } - } -@@ -2401,6 +2412,18 @@ macro_rules! key { - } - } - } ); -+ ($key_name:ident, Conv) => ( { -+ let name = (stringify!($key_name)).replace("_", "-"); -+ obj.remove(&name).and_then(|o| o.as_str().and_then(|s| { -+ match Conv::from_str(s) { -+ Ok(c) => { -+ base.$key_name = c; -+ Some(Ok(())) -+ } -+ Err(e) => Some(Err(e)) -+ } -+ })).unwrap_or(Ok(())) -+ } ); - } - - if let Some(j) = obj.remove("target-endian") { -@@ -2520,6 +2543,8 @@ macro_rules! key { - key!(c_enum_min_bits, u64); - key!(generate_arange_section, bool); - key!(supports_stack_protector, bool); -+ key!(entry_name); -+ key!(entry_abi, Conv)?; - - if base.is_builtin { - // This can cause unfortunate ICEs later down the line. -@@ -2770,6 +2795,8 @@ macro_rules! target_option_val { - target_option_val!(c_enum_min_bits); - target_option_val!(generate_arange_section); - target_option_val!(supports_stack_protector); -+ target_option_val!(entry_name); -+ target_option_val!(entry_abi); - - if let Some(abi) = self.default_adjusted_cabi { - d.insert("default-adjusted-cabi".into(), Abi::name(abi).to_json()); --- -2.38.1 - diff --git a/SOURCES/0001-Let-environment-variables-override-some-default-CPUs.patch b/SOURCES/0001-Let-environment-variables-override-some-default-CPUs.patch new file mode 100644 index 0000000..c394f78 --- /dev/null +++ b/SOURCES/0001-Let-environment-variables-override-some-default-CPUs.patch @@ -0,0 +1,53 @@ +From 6e2adb05860b72610291d3b0e8bd525c44cb0cc9 Mon Sep 17 00:00:00 2001 +From: Josh Stone +Date: Fri, 9 Jun 2023 15:23:08 -0700 +Subject: [PATCH] Let environment variables override some default CPUs + +--- + compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs | 2 +- + compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs | 2 +- + compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs | 2 +- + 3 files changed, 3 insertions(+), 3 deletions(-) + +diff --git a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs +index fd896e086b54..08d0c43d20b4 100644 +--- a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs +@@ -2,7 +2,7 @@ + + pub fn target() -> Target { + let mut base = super::linux_gnu_base::opts(); +- base.cpu = "ppc64le".into(); ++ base.cpu = option_env!("RUSTC_TARGET_CPU_PPC64LE").unwrap_or("ppc64le").into(); + base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); + base.max_atomic_width = Some(64); + base.stack_probes = StackProbeType::Inline; +diff --git a/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs +index f2c722b9a89d..17a14d10b27e 100644 +--- a/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/s390x_unknown_linux_gnu.rs +@@ -5,7 +5,7 @@ pub fn target() -> Target { + let mut base = super::linux_gnu_base::opts(); + base.endian = Endian::Big; + // z10 is the oldest CPU supported by LLVM +- base.cpu = "z10".into(); ++ base.cpu = option_env!("RUSTC_TARGET_CPU_S390X").unwrap_or("z10").into(); + // FIXME: The ABI implementation in cabi_s390x.rs is for now hard-coded to assume the no-vector + // ABI. Pass the -vector feature string to LLVM to respect this assumption. On LLVM < 16, we + // also strip v128 from the data_layout below to match the older LLVM's expectation. +diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs +index 9af1049b8702..68f876dd18c3 100644 +--- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs ++++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs +@@ -2,7 +2,7 @@ + + pub fn target() -> Target { + let mut base = super::linux_gnu_base::opts(); +- base.cpu = "x86-64".into(); ++ base.cpu = option_env!("RUSTC_TARGET_CPU_X86_64").unwrap_or("x86-64").into(); + base.max_atomic_width = Some(64); + base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); + base.stack_probes = StackProbeType::X86; +-- +2.40.1 + diff --git a/SOURCES/0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch b/SOURCES/0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch deleted file mode 100644 index 3f087ef..0000000 --- a/SOURCES/0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 98ae83daae67e9e7663b8345eced1de8c667271f Mon Sep 17 00:00:00 2001 -From: Dan Gohman -Date: Thu, 8 Dec 2022 10:35:46 -0800 -Subject: [PATCH] Mangle "main" as "__main_void" on wasm32-wasi - -On wasm, the age-old C trick of having a main function which can either have -no arguments or argc+argv doesn't work, because wasm requires caller and -callee signatures to match. WASI's current strategy is to have compilers -mangle main's name to indicate which signature they're using. Rust uses the -no-argument form, which should be mangled as `__main_void`. - -This is needed on wasm32-wasi as of #105395. ---- - compiler/rustc_target/src/spec/wasm32_wasi.rs | 4 ++++ - 1 file changed, 4 insertions(+) - -diff --git a/compiler/rustc_target/src/spec/wasm32_wasi.rs b/compiler/rustc_target/src/spec/wasm32_wasi.rs -index 6f0bbf0672d4..a0476d542e64 100644 ---- a/compiler/rustc_target/src/spec/wasm32_wasi.rs -+++ b/compiler/rustc_target/src/spec/wasm32_wasi.rs -@@ -104,6 +104,10 @@ pub fn target() -> Target { - // `args::args()` makes the WASI API calls itself. - options.main_needs_argc_argv = false; - -+ // And, WASI mangles the name of "main" to distinguish between different -+ // signatures. -+ options.entry_name = "__main_void".into(); -+ - Target { - llvm_target: "wasm32-wasi".into(), - pointer_width: 32, --- -2.38.1 - diff --git a/SOURCES/0001-bootstrap-config-fix-version-comparison-bug.patch b/SOURCES/0001-bootstrap-config-fix-version-comparison-bug.patch new file mode 100644 index 0000000..f0c4e55 --- /dev/null +++ b/SOURCES/0001-bootstrap-config-fix-version-comparison-bug.patch @@ -0,0 +1,36 @@ +From a627c8f54cab6880dc7d36c55092a94c6f750a6e Mon Sep 17 00:00:00 2001 +From: Ariadne Conill +Date: Thu, 3 Aug 2023 15:05:40 -0700 +Subject: [PATCH] bootstrap: config: fix version comparison bug + +Rust requires a previous version of Rust to build, such as the current version, or the +previous version. However, the version comparison logic did not take patch releases +into consideration when doing the version comparison for the current branch, e.g. +Rust 1.71.1 could not be built by Rust 1.71.0 because it is neither an exact version +match, or the previous version. + +Adjust the version comparison logic to tolerate mismatches in the patch version. + +Signed-off-by: Ariadne Conill +(cherry picked from commit 31a81a08786826cc6e832bd0b49fb8b934e29648) +--- + src/bootstrap/config.rs | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs +index e192cda9a9a7..2b5d0b94e968 100644 +--- a/src/bootstrap/config.rs ++++ b/src/bootstrap/config.rs +@@ -1805,7 +1805,8 @@ pub fn check_build_rustc_version(&self) { + .unwrap(); + if !(source_version == rustc_version + || (source_version.major == rustc_version.major +- && source_version.minor == rustc_version.minor + 1)) ++ && (source_version.minor == rustc_version.minor ++ || source_version.minor == rustc_version.minor + 1))) + { + let prev_version = format!("{}.{}.x", source_version.major, source_version.minor - 1); + eprintln!( +-- +2.41.0 + diff --git a/SOURCES/0001-compiletest-set-the-dylib-path-when-gathering-target.patch b/SOURCES/0001-compiletest-set-the-dylib-path-when-gathering-target.patch deleted file mode 100644 index 54185a7..0000000 --- a/SOURCES/0001-compiletest-set-the-dylib-path-when-gathering-target.patch +++ /dev/null @@ -1,185 +0,0 @@ -From 2bdbc5fbf7f84c62f8c7b1007f3b6fd6d3da06f6 Mon Sep 17 00:00:00 2001 -From: Josh Stone -Date: Fri, 14 Oct 2022 16:11:28 -0700 -Subject: [PATCH] compiletest: set the dylib path when gathering target cfg - -If the compiler is built with `rpath = false`, then it won't find its -own libraries unless the library search path is set. We already do that -while running the actual compiletests, but #100260 added another rustc -command for getting the target cfg. - - Check compiletest suite=codegen mode=codegen (x86_64-unknown-linux-gnu -> x86_64-unknown-linux-gnu) - thread 'main' panicked at 'error: failed to get cfg info from "[...]/build/x86_64-unknown-linux-gnu/stage1/bin/rustc" - --- stdout - - --- stderr - [...]/build/x86_64-unknown-linux-gnu/stage1/bin/rustc: error while loading shared libraries: librustc_driver-a2a76dc626cd02d2.so: cannot open shared object file: No such file or directory - ', src/tools/compiletest/src/common.rs:476:13 - -Now the library path is set here as well, so it works without rpath. - -(cherry picked from commit f8a0cc2ca8a644ddb63867526711ba17cb7508c8) ---- - src/tools/compiletest/src/common.rs | 20 +++++++++++--------- - src/tools/compiletest/src/runtest.rs | 27 +++------------------------ - src/tools/compiletest/src/util.rs | 23 +++++++++++++++++++++++ - 3 files changed, 37 insertions(+), 33 deletions(-) - -diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs -index 0260f6848386..9a432f11f82f 100644 ---- a/src/tools/compiletest/src/common.rs -+++ b/src/tools/compiletest/src/common.rs -@@ -2,11 +2,12 @@ - - use std::ffi::OsString; - use std::fmt; -+use std::iter; - use std::path::{Path, PathBuf}; - use std::process::Command; - use std::str::FromStr; - --use crate::util::PathBufExt; -+use crate::util::{add_dylib_path, PathBufExt}; - use lazycell::LazyCell; - use test::ColorConfig; - -@@ -385,8 +386,7 @@ pub fn run_enabled(&self) -> bool { - } - - fn target_cfg(&self) -> &TargetCfg { -- self.target_cfg -- .borrow_with(|| TargetCfg::new(&self.rustc_path, &self.target, &self.target_rustcflags)) -+ self.target_cfg.borrow_with(|| TargetCfg::new(self)) - } - - pub fn matches_arch(&self, arch: &str) -> bool { -@@ -457,21 +457,23 @@ pub enum Endian { - } - - impl TargetCfg { -- fn new(rustc_path: &Path, target: &str, target_rustcflags: &Vec) -> TargetCfg { -- let output = match Command::new(rustc_path) -+ fn new(config: &Config) -> TargetCfg { -+ let mut command = Command::new(&config.rustc_path); -+ add_dylib_path(&mut command, iter::once(&config.compile_lib_path)); -+ let output = match command - .arg("--print=cfg") - .arg("--target") -- .arg(target) -- .args(target_rustcflags) -+ .arg(&config.target) -+ .args(&config.target_rustcflags) - .output() - { - Ok(output) => output, -- Err(e) => panic!("error: failed to get cfg info from {:?}: {e}", rustc_path), -+ Err(e) => panic!("error: failed to get cfg info from {:?}: {e}", config.rustc_path), - }; - if !output.status.success() { - panic!( - "error: failed to get cfg info from {:?}\n--- stdout\n{}\n--- stderr\n{}", -- rustc_path, -+ config.rustc_path, - String::from_utf8(output.stdout).unwrap(), - String::from_utf8(output.stderr).unwrap(), - ); -diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs -index 8af5f1da694b..f8903f754f09 100644 ---- a/src/tools/compiletest/src/runtest.rs -+++ b/src/tools/compiletest/src/runtest.rs -@@ -13,7 +13,7 @@ - use crate::header::TestProps; - use crate::json; - use crate::read2::read2_abbreviated; --use crate::util::{logv, PathBufExt}; -+use crate::util::{add_dylib_path, dylib_env_var, logv, PathBufExt}; - use crate::ColorConfig; - use regex::{Captures, Regex}; - use rustfix::{apply_suggestions, get_suggestions_from_json, Filter}; -@@ -26,6 +26,7 @@ - use std::hash::{Hash, Hasher}; - use std::io::prelude::*; - use std::io::{self, BufReader}; -+use std::iter; - use std::path::{Path, PathBuf}; - use std::process::{Child, Command, ExitStatus, Output, Stdio}; - use std::str; -@@ -72,19 +73,6 @@ fn disable_error_reporting R, R>(f: F) -> R { - f() - } - --/// The name of the environment variable that holds dynamic library locations. --pub fn dylib_env_var() -> &'static str { -- if cfg!(windows) { -- "PATH" -- } else if cfg!(target_os = "macos") { -- "DYLD_LIBRARY_PATH" -- } else if cfg!(target_os = "haiku") { -- "LIBRARY_PATH" -- } else { -- "LD_LIBRARY_PATH" -- } --} -- - /// The platform-specific library name - pub fn get_lib_name(lib: &str, dylib: bool) -> String { - // In some casess (e.g. MUSL), we build a static -@@ -1811,16 +1799,7 @@ fn compose_and_run( - - // Need to be sure to put both the lib_path and the aux path in the dylib - // search path for the child. -- let mut path = -- env::split_paths(&env::var_os(dylib_env_var()).unwrap_or_default()).collect::>(); -- if let Some(p) = aux_path { -- path.insert(0, PathBuf::from(p)) -- } -- path.insert(0, PathBuf::from(lib_path)); -- -- // Add the new dylib search path var -- let newpath = env::join_paths(&path).unwrap(); -- command.env(dylib_env_var(), newpath); -+ add_dylib_path(&mut command, iter::once(lib_path).chain(aux_path)); - - let mut child = disable_error_reporting(|| command.spawn()) - .unwrap_or_else(|_| panic!("failed to exec `{:?}`", &command)); -diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs -index e5ff0906be8a..ec36f1e4fb72 100644 ---- a/src/tools/compiletest/src/util.rs -+++ b/src/tools/compiletest/src/util.rs -@@ -2,6 +2,7 @@ - use std::env; - use std::ffi::OsStr; - use std::path::PathBuf; -+use std::process::Command; - - use tracing::*; - -@@ -111,3 +112,25 @@ fn with_extra_extension>(&self, extension: S) -> PathBuf { - } - } - } -+ -+/// The name of the environment variable that holds dynamic library locations. -+pub fn dylib_env_var() -> &'static str { -+ if cfg!(windows) { -+ "PATH" -+ } else if cfg!(target_os = "macos") { -+ "DYLD_LIBRARY_PATH" -+ } else if cfg!(target_os = "haiku") { -+ "LIBRARY_PATH" -+ } else { -+ "LD_LIBRARY_PATH" -+ } -+} -+ -+/// Adds a list of lookup paths to `cmd`'s dynamic library lookup path. -+/// If the dylib_path_var is already set for this cmd, the old value will be overwritten! -+pub fn add_dylib_path(cmd: &mut Command, paths: impl Iterator>) { -+ let path_env = env::var_os(dylib_env_var()); -+ let old_paths = path_env.as_ref().map(env::split_paths); -+ let new_paths = paths.map(Into::into).chain(old_paths.into_iter().flatten()); -+ cmd.env(dylib_env_var(), env::join_paths(new_paths).unwrap()); -+} --- -2.38.1 - diff --git a/SOURCES/CVE-2023-38497-cargo-umask.patch b/SOURCES/CVE-2023-38497-cargo-umask.patch deleted file mode 100644 index 53d92f8..0000000 --- a/SOURCES/CVE-2023-38497-cargo-umask.patch +++ /dev/null @@ -1,1468 +0,0 @@ -From 954b55b8ab90959335cd721b977e69263e07ff38 Mon Sep 17 00:00:00 2001 -From: Weihang Lo -Date: Fri, 7 Jul 2023 14:44:11 +0100 -Subject: [CVE-2023-38497 1/4] test: verify permissions bits are preserved when - unpacking - -This is not secure and will be fixed in the next commit. ---- - src/tools/cargo/tests/testsuite/registry.rs | 55 +++++++++++++++++++++ - 1 file changed, 55 insertions(+) - -diff --git a/src/tools/cargo/tests/testsuite/registry.rs b/src/tools/cargo/tests/testsuite/registry.rs -index 60c52fd54625..d04dbbf35604 100644 ---- a/src/tools/cargo/tests/testsuite/registry.rs -+++ b/src/tools/cargo/tests/testsuite/registry.rs -@@ -2941,3 +2941,58 @@ required by package `foo v0.1.0 ([ROOT]/foo)` - .with_status(101) - .run(); - } -+ -+#[cfg(unix)] -+#[cargo_test] -+fn set_mask_during_unpacking() { -+ use std::os::unix::fs::MetadataExt; -+ -+ Package::new("bar", "1.0.0") -+ .file_with_mode("example.sh", 0o777, "#!/bin/sh") -+ .file_with_mode("src/lib.rs", 0o666, "") -+ .publish(); -+ -+ let p = project() -+ .file( -+ "Cargo.toml", -+ r#" -+ [package] -+ name = "foo" -+ version = "0.1.0" -+ -+ [dependencies] -+ bar = "1.0" -+ "#, -+ ) -+ .file("src/lib.rs", "") -+ .build(); -+ -+ p.cargo("fetch") -+ .with_stderr( -+ "\ -+[UPDATING] `dummy-registry` index -+[DOWNLOADING] crates ... -+[DOWNLOADED] bar v1.0.0 (registry `dummy-registry`) -+", -+ ) -+ .run(); -+ let src_file_path = |path: &str| { -+ glob::glob( -+ paths::home() -+ .join(".cargo/registry/src/*/bar-1.0.0/") -+ .join(path) -+ .to_str() -+ .unwrap(), -+ ) -+ .unwrap() -+ .next() -+ .unwrap() -+ .unwrap() -+ }; -+ -+ // Assuming umask is `0o022`. -+ let metadata = fs::metadata(src_file_path("src/lib.rs")).unwrap(); -+ assert_eq!(metadata.mode() & 0o777, 0o666); -+ let metadata = fs::metadata(src_file_path("example.sh")).unwrap(); -+ assert_eq!(metadata.mode() & 0o777, 0o777); -+} --- -2.41.0 - - -From 11fada38ef0249af79213188c8d6a57cecab5023 Mon Sep 17 00:00:00 2001 -From: Weihang Lo -Date: Fri, 7 Jul 2023 14:50:59 +0100 -Subject: [CVE-2023-38497 2/4] fix: respect `umask` when unpacking `.crate` - files - -Without this, an attacker can upload globally writable files buried -in the `.crate` file. After a user downloaded and unpacked the file, -the attacker can then write malicous code to the downloaded sources. - ---- - -Modified while backporting to use `lazy_static` instead of `OnceLock`. - -Co-authored-by: Josh Stone ---- - Cargo.lock | 4 ++-- - src/tools/cargo/Cargo.toml | 2 +- - .../cargo/src/cargo/sources/registry/mod.rs | 15 +++++++++++++++ - src/tools/cargo/src/cargo/util/mod.rs | 19 +++++++++++++++++++ - src/tools/cargo/tests/testsuite/registry.rs | 6 +++--- - src/tools/cargo/tests/testsuite/vendor.rs | 5 +++-- - 6 files changed, 43 insertions(+), 8 deletions(-) - -diff --git a/Cargo.lock b/Cargo.lock -index 50f732837865..7bcfacd1c5ea 100644 ---- a/Cargo.lock -+++ b/Cargo.lock -@@ -4807,9 +4807,9 @@ dependencies = [ - - [[package]] - name = "tar" --version = "0.4.38" -+version = "0.4.39" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" -+checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" - dependencies = [ - "filetime", - "libc", -diff --git a/src/tools/cargo/Cargo.toml b/src/tools/cargo/Cargo.toml -index 4b4f328e189a..3f692a35c353 100644 ---- a/src/tools/cargo/Cargo.toml -+++ b/src/tools/cargo/Cargo.toml -@@ -58,7 +58,7 @@ serde-value = "0.7.0" - sha1 = "0.10.5" - shell-escape = "0.1.4" - strip-ansi-escapes = "0.1.0" --tar = { version = "0.4.38", default-features = false } -+tar = { version = "0.4.39", default-features = false } - tempfile = "3.0" - termcolor = "1.1" - toml_edit = { version = "0.15.0", features = ["serde", "easy", "perf"] } -diff --git a/src/tools/cargo/src/cargo/sources/registry/mod.rs b/src/tools/cargo/src/cargo/sources/registry/mod.rs -index cabd4f9c6038..905ba938cd1d 100644 ---- a/src/tools/cargo/src/cargo/sources/registry/mod.rs -+++ b/src/tools/cargo/src/cargo/sources/registry/mod.rs -@@ -162,6 +162,7 @@ use std::borrow::Cow; - use std::collections::BTreeMap; - use std::collections::HashSet; - use std::fs::{File, OpenOptions}; -+use std::io::Read; - use std::io::Write; - use std::path::{Path, PathBuf}; - use std::task::Poll; -@@ -620,6 +621,7 @@ impl<'cfg> RegistrySource<'cfg> { - let gz = GzDecoder::new(tarball); - let gz = LimitErrorReader::new(gz, max_unpack_size()); - let mut tar = Archive::new(gz); -+ set_mask(&mut tar); - let prefix = unpack_dir.file_name().unwrap(); - let parent = unpack_dir.parent().unwrap(); - for entry in tar.entries()? { -@@ -872,3 +874,16 @@ mod tests { - assert_eq!(make_dep_prefix("aBcDe"), "aB/cD"); - } - } -+ -+/// Set the current [`umask`] value for the given tarball. No-op on non-Unix -+/// platforms. -+/// -+/// On Windows, tar only looks at user permissions and tries to set the "read -+/// only" attribute, so no-op as well. -+/// -+/// [`umask`]: https://man7.org/linux/man-pages/man2/umask.2.html -+#[allow(unused_variables)] -+fn set_mask(tar: &mut Archive) { -+ #[cfg(unix)] -+ tar.set_mask(crate::util::get_umask()); -+} -diff --git a/src/tools/cargo/src/cargo/util/mod.rs b/src/tools/cargo/src/cargo/util/mod.rs -index 9881332ecafc..d681fb766469 100644 ---- a/src/tools/cargo/src/cargo/util/mod.rs -+++ b/src/tools/cargo/src/cargo/util/mod.rs -@@ -122,3 +122,22 @@ pub fn truncate_with_ellipsis(s: &str, max_width: usize) -> String { - } - prefix - } -+ -+/// Get the current [`umask`] value. -+/// -+/// [`umask`]: https://man7.org/linux/man-pages/man2/umask.2.html -+#[cfg(unix)] -+pub fn get_umask() -> u32 { -+ // SAFETY: Syscalls are unsafe. Calling `umask` twice is even unsafer for -+ // multithreading program, since it doesn't provide a way to retrive the -+ // value without modifications. We use a `lazy_static` here to ensure -+ // it only gets call once during the entire program lifetime. -+ lazy_static::lazy_static! { -+ static ref UMASK: libc::mode_t = unsafe { -+ let umask = libc::umask(0o022); -+ libc::umask(umask); -+ umask -+ }; -+ } -+ *UMASK as u32 // it is u16 on macos -+} -diff --git a/src/tools/cargo/tests/testsuite/registry.rs b/src/tools/cargo/tests/testsuite/registry.rs -index d04dbbf35604..c18613f9d30c 100644 ---- a/src/tools/cargo/tests/testsuite/registry.rs -+++ b/src/tools/cargo/tests/testsuite/registry.rs -@@ -2990,9 +2990,9 @@ fn set_mask_during_unpacking() { - .unwrap() - }; - -- // Assuming umask is `0o022`. -+ let umask = cargo::util::get_umask(); - let metadata = fs::metadata(src_file_path("src/lib.rs")).unwrap(); -- assert_eq!(metadata.mode() & 0o777, 0o666); -+ assert_eq!(metadata.mode() & 0o777, 0o666 & !umask); - let metadata = fs::metadata(src_file_path("example.sh")).unwrap(); -- assert_eq!(metadata.mode() & 0o777, 0o777); -+ assert_eq!(metadata.mode() & 0o777, 0o777 & !umask); - } -diff --git a/src/tools/cargo/tests/testsuite/vendor.rs b/src/tools/cargo/tests/testsuite/vendor.rs -index 8e985e265a3d..db6f114cac69 100644 ---- a/src/tools/cargo/tests/testsuite/vendor.rs -+++ b/src/tools/cargo/tests/testsuite/vendor.rs -@@ -890,10 +890,11 @@ fn vendor_preserves_permissions() { - - p.cargo("vendor --respect-source-config").run(); - -+ let umask = cargo::util::get_umask(); - let metadata = fs::metadata(p.root().join("vendor/bar/src/lib.rs")).unwrap(); -- assert_eq!(metadata.mode() & 0o777, 0o644); -+ assert_eq!(metadata.mode() & 0o777, 0o644 & !umask); - let metadata = fs::metadata(p.root().join("vendor/bar/example.sh")).unwrap(); -- assert_eq!(metadata.mode() & 0o777, 0o755); -+ assert_eq!(metadata.mode() & 0o777, 0o755 & !umask); - } - - #[cargo_test] --- -2.41.0 - - -From 86e9f660833ac2c60e335cc961498d8da546e8b4 Mon Sep 17 00:00:00 2001 -From: Weihang Lo -Date: Fri, 7 Jul 2023 18:18:39 +0100 -Subject: [CVE-2023-38497 3/4] fix: clear cache for old `.cargo-ok` format - -In 1.71, `.cargo-ok` changed to contain a JSON `{ v: 1 }` to indicate -the version of it. A failure of parsing will result in a heavy-hammer -approach that unpacks the `.crate` file again. This is in response to a -security issue that the unpacking didn't respect umask on Unix systems. ---- - .../cargo/src/cargo/sources/registry/mod.rs | 84 +++++++++++- - src/tools/cargo/tests/testsuite/registry.rs | 120 +++++++++++++++++- - 2 files changed, 195 insertions(+), 9 deletions(-) - -diff --git a/src/tools/cargo/src/cargo/sources/registry/mod.rs b/src/tools/cargo/src/cargo/sources/registry/mod.rs -index 905ba938cd1d..1bd98964066e 100644 ---- a/src/tools/cargo/src/cargo/sources/registry/mod.rs -+++ b/src/tools/cargo/src/cargo/sources/registry/mod.rs -@@ -161,18 +161,21 @@ - use std::borrow::Cow; - use std::collections::BTreeMap; - use std::collections::HashSet; -+use std::fs; - use std::fs::{File, OpenOptions}; -+use std::io; - use std::io::Read; - use std::io::Write; - use std::path::{Path, PathBuf}; - use std::task::Poll; - - use anyhow::Context as _; --use cargo_util::paths::exclude_from_backups_and_indexing; -+use cargo_util::paths::{self, exclude_from_backups_and_indexing}; - use flate2::read::GzDecoder; - use log::debug; - use semver::Version; - use serde::Deserialize; -+use serde::Serialize; - use tar::Archive; - - use crate::core::dependency::{DepKind, Dependency}; -@@ -199,6 +202,14 @@ const LOWER_PREFIX_TEMPLATE: &str = "{lowerprefix}"; - const CHECKSUM_TEMPLATE: &str = "{sha256-checksum}"; - const MAX_UNPACK_SIZE: u64 = 512 * 1024 * 1024; - -+/// The content inside `.cargo-ok`. -+/// See [`RegistrySource::unpack_package`] for more. -+#[derive(Deserialize, Serialize)] -+struct LockMetadata { -+ /// The version of `.cargo-ok` file -+ v: u32, -+} -+ - /// A "source" for a local (see `local::LocalRegistry`) or remote (see - /// `remote::RemoteRegistry`) registry. - /// -@@ -604,20 +615,77 @@ impl<'cfg> RegistrySource<'cfg> { - /// compiled. - /// - /// No action is taken if the source looks like it's already unpacked. -+ /// -+ /// # History of interruption detection with `.cargo-ok` file -+ /// -+ /// Cargo has always included a `.cargo-ok` file ([`PACKAGE_SOURCE_LOCK`]) -+ /// to detect if extraction was interrupted, but it was originally empty. -+ /// -+ /// In 1.34, Cargo was changed to create the `.cargo-ok` file before it -+ /// started extraction to implement fine-grained locking. After it was -+ /// finished extracting, it wrote two bytes to indicate it was complete. -+ /// It would use the length check to detect if it was possibly interrupted. -+ /// -+ /// In 1.36, Cargo changed to not use fine-grained locking, and instead used -+ /// a global lock. The use of `.cargo-ok` was no longer needed for locking -+ /// purposes, but was kept to detect when extraction was interrupted. -+ /// -+ /// In 1.49, Cargo changed to not create the `.cargo-ok` file before it -+ /// started extraction to deal with `.crate` files that inexplicably had -+ /// a `.cargo-ok` file in them. -+ /// -+ /// In 1.64, Cargo changed to detect `.crate` files with `.cargo-ok` files -+ /// in them in response to [CVE-2022-36113], which dealt with malicious -+ /// `.crate` files making `.cargo-ok` a symlink causing cargo to write "ok" -+ /// to any arbitrary file on the filesystem it has permission to. -+ /// -+ /// In 1.71, `.cargo-ok` changed to contain a JSON `{ v: 1 }` to indicate -+ /// the version of it. A failure of parsing will result in a heavy-hammer -+ /// approach that unpacks the `.crate` file again. This is in response to a -+ /// security issue that the unpacking didn't respect umask on Unix systems. -+ /// -+ /// This is all a long-winded way of explaining the circumstances that might -+ /// cause a directory to contain a `.cargo-ok` file that is empty or -+ /// otherwise corrupted. Either this was extracted by a version of Rust -+ /// before 1.34, in which case everything should be fine. However, an empty -+ /// file created by versions 1.36 to 1.49 indicates that the extraction was -+ /// interrupted and that we need to start again. -+ /// -+ /// Another possibility is that the filesystem is simply corrupted, in -+ /// which case deleting the directory might be the safe thing to do. That -+ /// is probably unlikely, though. -+ /// -+ /// To be safe, we deletes the directory and starts over again if an empty -+ /// `.cargo-ok` file is found. -+ /// -+ /// [CVE-2022-36113]: https://blog.rust-lang.org/2022/09/14/cargo-cves.html#arbitrary-file-corruption-cve-2022-36113 - fn unpack_package(&self, pkg: PackageId, tarball: &File) -> CargoResult { - // The `.cargo-ok` file is used to track if the source is already - // unpacked. - let package_dir = format!("{}-{}", pkg.name(), pkg.version()); - let dst = self.src_path.join(&package_dir); -- dst.create_dir()?; - let path = dst.join(PACKAGE_SOURCE_LOCK); - let path = self.config.assert_package_cache_locked(&path); - let unpack_dir = path.parent().unwrap(); -- if let Ok(meta) = path.metadata() { -- if meta.len() > 0 { -- return Ok(unpack_dir.to_path_buf()); -- } -+ match fs::read_to_string(path) { -+ Ok(ok) => match serde_json::from_str::(&ok) { -+ Ok(lock_meta) if lock_meta.v == 1 => { -+ return Ok(unpack_dir.to_path_buf()); -+ } -+ _ => { -+ if ok == "ok" { -+ log::debug!("old `ok` content found, clearing cache"); -+ } else { -+ log::warn!("unrecognized .cargo-ok content, clearing cache: {ok}"); -+ } -+ // See comment of `unpack_package` about why removing all stuff. -+ paths::remove_dir_all(dst.as_path_unlocked())?; -+ } -+ }, -+ Err(e) if e.kind() == io::ErrorKind::NotFound => {} -+ Err(e) => anyhow::bail!("unable to read .cargo-ok file at {path:?}: {e}"), - } -+ dst.create_dir()?; - let gz = GzDecoder::new(tarball); - let gz = LimitErrorReader::new(gz, max_unpack_size()); - let mut tar = Archive::new(gz); -@@ -675,7 +743,9 @@ impl<'cfg> RegistrySource<'cfg> { - .write(true) - .open(&path) - .with_context(|| format!("failed to open `{}`", path.display()))?; -- write!(ok, "ok")?; -+ -+ let lock_meta = LockMetadata { v: 1 }; -+ write!(ok, "{}", serde_json::to_string(&lock_meta).unwrap())?; - - Ok(unpack_dir.to_path_buf()) - } -diff --git a/src/tools/cargo/tests/testsuite/registry.rs b/src/tools/cargo/tests/testsuite/registry.rs -index c18613f9d30c..1d2e231363c4 100644 ---- a/src/tools/cargo/tests/testsuite/registry.rs -+++ b/src/tools/cargo/tests/testsuite/registry.rs -@@ -2594,7 +2594,7 @@ fn package_lock_inside_package_is_overwritten() { - .join("bar-0.0.1") - .join(".cargo-ok"); - -- assert_eq!(ok.metadata().unwrap().len(), 2); -+ assert_eq!(ok.metadata().unwrap().len(), 7); - } - - #[cargo_test] -@@ -2634,7 +2634,7 @@ fn package_lock_as_a_symlink_inside_package_is_overwritten() { - let librs = pkg_root.join("src/lib.rs"); - - // Is correctly overwritten and doesn't affect the file linked to -- assert_eq!(ok.metadata().unwrap().len(), 2); -+ assert_eq!(ok.metadata().unwrap().len(), 7); - assert_eq!(fs::read_to_string(librs).unwrap(), "pub fn f() {}"); - } - -@@ -2942,6 +2942,51 @@ required by package `foo v0.1.0 ([ROOT]/foo)` - .run(); - } - -+#[cargo_test] -+fn corrupted_ok_overwritten() { -+ // Checks what happens if .cargo-ok gets truncated, such as if the file is -+ // created, but the flush/close is interrupted. -+ Package::new("bar", "1.0.0").publish(); -+ let p = project() -+ .file( -+ "Cargo.toml", -+ r#" -+ [package] -+ name = "foo" -+ version = "0.1.0" -+ -+ [dependencies] -+ bar = "1" -+ "#, -+ ) -+ .file("src/lib.rs", "") -+ .build(); -+ p.cargo("fetch") -+ .with_stderr( -+ "\ -+[UPDATING] `dummy-registry` index -+[DOWNLOADING] crates ... -+[DOWNLOADED] bar v1.0.0 (registry `dummy-registry`) -+", -+ ) -+ .run(); -+ let ok = glob::glob( -+ paths::home() -+ .join(".cargo/registry/src/*/bar-1.0.0/.cargo-ok") -+ .to_str() -+ .unwrap(), -+ ) -+ .unwrap() -+ .next() -+ .unwrap() -+ .unwrap(); -+ // Simulate cargo being interrupted, or filesystem corruption. -+ fs::write(&ok, "").unwrap(); -+ assert_eq!(fs::read_to_string(&ok).unwrap(), ""); -+ p.cargo("fetch").with_stderr("").run(); -+ assert_eq!(fs::read_to_string(&ok).unwrap(), r#"{"v":1}"#); -+} -+ - #[cfg(unix)] - #[cargo_test] - fn set_mask_during_unpacking() { -@@ -2996,3 +3041,74 @@ fn set_mask_during_unpacking() { - let metadata = fs::metadata(src_file_path("example.sh")).unwrap(); - assert_eq!(metadata.mode() & 0o777, 0o777 & !umask); - } -+ -+#[cargo_test] -+fn unpack_again_when_cargo_ok_is_unrecognized() { -+ Package::new("bar", "1.0.0").publish(); -+ -+ let p = project() -+ .file( -+ "Cargo.toml", -+ r#" -+ [package] -+ name = "foo" -+ version = "0.1.0" -+ -+ [dependencies] -+ bar = "1.0" -+ "#, -+ ) -+ .file("src/lib.rs", "") -+ .build(); -+ -+ p.cargo("fetch") -+ .with_stderr( -+ "\ -+[UPDATING] `dummy-registry` index -+[DOWNLOADING] crates ... -+[DOWNLOADED] bar v1.0.0 (registry `dummy-registry`) -+", -+ ) -+ .run(); -+ -+ let src_file_path = |path: &str| { -+ glob::glob( -+ paths::home() -+ .join(".cargo/registry/src/*/bar-1.0.0/") -+ .join(path) -+ .to_str() -+ .unwrap(), -+ ) -+ .unwrap() -+ .next() -+ .unwrap() -+ .unwrap() -+ }; -+ -+ // Change permissions to simulate the old behavior not respecting umask. -+ let lib_rs = src_file_path("src/lib.rs"); -+ let cargo_ok = src_file_path(".cargo-ok"); -+ let mut perms = fs::metadata(&lib_rs).unwrap().permissions(); -+ assert!(!perms.readonly()); -+ perms.set_readonly(true); -+ fs::set_permissions(&lib_rs, perms).unwrap(); -+ let ok = fs::read_to_string(&cargo_ok).unwrap(); -+ assert_eq!(&ok, r#"{"v":1}"#); -+ -+ p.cargo("fetch").with_stderr("").run(); -+ -+ // Without changing `.cargo-ok`, a unpack won't be triggered. -+ let perms = fs::metadata(&lib_rs).unwrap().permissions(); -+ assert!(perms.readonly()); -+ -+ // Write "ok" to simulate the old behavior and trigger the unpack again. -+ fs::write(&cargo_ok, "ok").unwrap(); -+ -+ p.cargo("fetch").with_stderr("").run(); -+ -+ // Permission has been restored and `.cargo-ok` is in the new format. -+ let perms = fs::metadata(lib_rs).unwrap().permissions(); -+ assert!(!perms.readonly()); -+ let ok = fs::read_to_string(&cargo_ok).unwrap(); -+ assert_eq!(&ok, r#"{"v":1}"#); -+} --- -2.41.0 - - -From ac01a45267da1a154e2a1f3010d7e80c247e03a9 Mon Sep 17 00:00:00 2001 -From: Josh Stone -Date: Mon, 7 Aug 2023 12:11:42 -0700 -Subject: [CVE-2023-38497 4/4] Update vendored tar to 0.4.39 - ---- - src/bootstrap/Cargo.lock | 4 +- - vendor/tar/.cargo-checksum.json | 2 +- - vendor/tar/Cargo.lock | 207 +++++++++++++++++++++----------- - vendor/tar/Cargo.toml | 18 ++- - vendor/tar/src/archive.rs | 29 +++++ - vendor/tar/src/entry.rs | 180 ++++++++++++++++++++++++--- - vendor/tar/tests/all.rs | 107 ++++++++++++++++- - vendor/tar/tests/entry.rs | 31 +++++ - 8 files changed, 481 insertions(+), 97 deletions(-) - -diff --git a/src/bootstrap/Cargo.lock b/src/bootstrap/Cargo.lock -index baecca44cd98..5b0147b1d539 100644 ---- a/src/bootstrap/Cargo.lock -+++ b/src/bootstrap/Cargo.lock -@@ -622,9 +622,9 @@ dependencies = [ - - [[package]] - name = "tar" --version = "0.4.38" -+version = "0.4.39" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6" -+checksum = "ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96" - dependencies = [ - "filetime", - "libc", -diff --git a/vendor/tar/.cargo-checksum.json b/vendor/tar/.cargo-checksum.json -index 508f784e82ae..792994f557ae 100644 ---- a/vendor/tar/.cargo-checksum.json -+++ b/vendor/tar/.cargo-checksum.json -@@ -1 +1 @@ --{"files":{"Cargo.lock":"9872bf9e41b9cadee45b688c9537030a993ca49a266fc7859029d8c74810d1d5","Cargo.toml":"8353c71aa4d394efa7aaeac3004d0a16fd0c7124b7bd57ea91ba87a7b2015f15","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"71079f1a0962c2cf288058f38d24735bddabd1427ac2dee72ec18cc5ae4bceed","examples/extract_file.rs":"dc487f6631d824175afc3ee33de99e80718a8ca3f9e57fddd7cac0a46c07d3ae","examples/list.rs":"36e412205eaffea8ab7f39be4173594b74e36acb369e091362b1975ee4a7a14b","examples/raw_list.rs":"0a735576ac354457d6d5a4d395d044fae99bf67a7c69960ca784a6f6a1743651","examples/write.rs":"419ac3e4155035e32b52cd8e6ae987a2d99cf82f60abbfb315c2a2c4f8e8fd19","src/archive.rs":"85a0091e02690c62379137988cd9b2689009536a0b941f1ab0581db26e9ebce6","src/builder.rs":"2914f394d44c133557532bf5765fe63e0def30ec0b447f8f2bc620e932a2036a","src/entry.rs":"705016636f7fdcad4fe20d7d2672be2b94cc53bb05e47628f5212b89e17a40fe","src/entry_type.rs":"0786688729a96b4a3135b28d40b95c3d4feaad66b9574c490cbea14814ab975f","src/error.rs":"a20813fbc52f1f2e3a79654f62de6001759f6504a06acee5b0819d4865398587","src/header.rs":"fb2b1fa943c19635826b3f2becfb82527be7d08fdac115af840da3ff06152908","src/lib.rs":"5468e413205c907c367c35d28a528389103d68fd6a5b5979bbedba7c9e6b6c99","src/pax.rs":"54002e31151f9c50e02a3da26b3cacd1d3c9a3902daee008ab76d112cf5a2430","tests/all.rs":"567a05d54e369d22efe40f3507a26e21f7878b95bd05c811250b2c350761791b","tests/entry.rs":"c1411ee09da9edb659b508867f0960e804966dfd33801f4a7afaefda331479dd","tests/header/mod.rs":"02b05639f63c39a47559650c7209817bb60282deb4f679d5b001ed936343d9de"},"package":"4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6"} -\ No newline at end of file -+{"files":{"Cargo.lock":"a074bb3491e0d988605218e794859ddb067bb624e793a053645fbbabadde83f6","Cargo.toml":"638559bf51f1b89359ece700138f774bc0a5c1513046e306d6109dc045799b84","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"71079f1a0962c2cf288058f38d24735bddabd1427ac2dee72ec18cc5ae4bceed","examples/extract_file.rs":"dc487f6631d824175afc3ee33de99e80718a8ca3f9e57fddd7cac0a46c07d3ae","examples/list.rs":"36e412205eaffea8ab7f39be4173594b74e36acb369e091362b1975ee4a7a14b","examples/raw_list.rs":"0a735576ac354457d6d5a4d395d044fae99bf67a7c69960ca784a6f6a1743651","examples/write.rs":"419ac3e4155035e32b52cd8e6ae987a2d99cf82f60abbfb315c2a2c4f8e8fd19","src/archive.rs":"9238c58f5a253034f490ede4c42de6e1b89986ee6db343920ee34b3dcfa5b238","src/builder.rs":"2914f394d44c133557532bf5765fe63e0def30ec0b447f8f2bc620e932a2036a","src/entry.rs":"0e4b0438cbc4cbec30a821ce8f23619fe9e53c17022a022de609d642e220193c","src/entry_type.rs":"0786688729a96b4a3135b28d40b95c3d4feaad66b9574c490cbea14814ab975f","src/error.rs":"a20813fbc52f1f2e3a79654f62de6001759f6504a06acee5b0819d4865398587","src/header.rs":"fb2b1fa943c19635826b3f2becfb82527be7d08fdac115af840da3ff06152908","src/lib.rs":"5468e413205c907c367c35d28a528389103d68fd6a5b5979bbedba7c9e6b6c99","src/pax.rs":"54002e31151f9c50e02a3da26b3cacd1d3c9a3902daee008ab76d112cf5a2430","tests/all.rs":"7a64869cd99a4642f2db71aa7d283633199e59b88ccca112cb467b0739e64e83","tests/entry.rs":"af12d84160e5459ebaee6ecdd68e0c811438c37c0cb881ad210e7f94132b9739","tests/header/mod.rs":"02b05639f63c39a47559650c7209817bb60282deb4f679d5b001ed936343d9de"},"package":"ec96d2ffad078296368d46ff1cb309be1c23c513b4ab0e22a45de0185275ac96"} -\ No newline at end of file -diff --git a/vendor/tar/Cargo.lock b/vendor/tar/Cargo.lock -index dd53b90b5883..f63a631ad2fe 100644 ---- a/vendor/tar/Cargo.lock -+++ b/vendor/tar/Cargo.lock -@@ -2,12 +2,24 @@ - # It is not intended for manual editing. - version = 3 - -+[[package]] -+name = "autocfg" -+version = "1.1.0" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -+ - [[package]] - name = "bitflags" - version = "1.3.2" - source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -+[[package]] -+name = "cc" -+version = "1.0.79" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" -+ - [[package]] - name = "cfg-if" - version = "1.0.0" -@@ -15,101 +27,120 @@ source = "registry+https://github.com/rust-lang/crates.io-index" - checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - - [[package]] --name = "filetime" --version = "0.2.15" -+name = "errno" -+version = "0.3.1" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" -+checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" - dependencies = [ -- "cfg-if", -+ "errno-dragonfly", - "libc", -- "redox_syscall", -- "winapi", -+ "windows-sys", - ] - - [[package]] --name = "getrandom" --version = "0.2.3" -+name = "errno-dragonfly" -+version = "0.1.2" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" -+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" - dependencies = [ -- "cfg-if", -+ "cc", - "libc", -- "wasi", - ] - - [[package]] --name = "libc" --version = "0.2.103" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" -- --[[package]] --name = "ppv-lite86" --version = "0.2.10" -+name = "fastrand" -+version = "1.9.0" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" -+checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -+dependencies = [ -+ "instant", -+] - - [[package]] --name = "rand" --version = "0.8.4" -+name = "filetime" -+version = "0.2.21" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -+checksum = "5cbc844cecaee9d4443931972e1289c8ff485cb4cc2767cb03ca139ed6885153" - dependencies = [ -+ "cfg-if", - "libc", -- "rand_chacha", -- "rand_core", -- "rand_hc", -+ "redox_syscall 0.2.16", -+ "windows-sys", - ] - - [[package]] --name = "rand_chacha" --version = "0.3.1" -+name = "hermit-abi" -+version = "0.3.2" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" -+ -+[[package]] -+name = "instant" -+version = "0.1.12" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" - dependencies = [ -- "ppv-lite86", -- "rand_core", -+ "cfg-if", - ] - - [[package]] --name = "rand_core" --version = "0.6.3" -+name = "io-lifetimes" -+version = "1.0.11" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" - dependencies = [ -- "getrandom", -+ "hermit-abi", -+ "libc", -+ "windows-sys", - ] - - [[package]] --name = "rand_hc" --version = "0.3.1" -+name = "libc" -+version = "0.2.147" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" -+ -+[[package]] -+name = "linux-raw-sys" -+version = "0.3.8" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" -+ -+[[package]] -+name = "redox_syscall" -+version = "0.2.16" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" - dependencies = [ -- "rand_core", -+ "bitflags", - ] - - [[package]] - name = "redox_syscall" --version = "0.2.10" -+version = "0.3.5" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" -+checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" - dependencies = [ - "bitflags", - ] - - [[package]] --name = "remove_dir_all" --version = "0.5.3" -+name = "rustix" -+version = "0.37.23" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -+checksum = "4d69718bf81c6127a49dc64e44a742e8bb9213c0ff8869a22c308f84c1d4ab06" - dependencies = [ -- "winapi", -+ "bitflags", -+ "errno", -+ "io-lifetimes", -+ "libc", -+ "linux-raw-sys", -+ "windows-sys", - ] - - [[package]] - name = "tar" --version = "0.4.38" -+version = "0.4.39" - dependencies = [ - "filetime", - "libc", -@@ -119,51 +150,89 @@ dependencies = [ - - [[package]] - name = "tempfile" --version = "3.2.0" -+version = "3.6.0" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -+checksum = "31c0432476357e58790aaa47a8efb0c5138f137343f3b5f23bd36a27e3b0a6d6" - dependencies = [ -+ "autocfg", - "cfg-if", -- "libc", -- "rand", -- "redox_syscall", -- "remove_dir_all", -- "winapi", -+ "fastrand", -+ "redox_syscall 0.3.5", -+ "rustix", -+ "windows-sys", - ] - - [[package]] --name = "wasi" --version = "0.10.2+wasi-snapshot-preview1" -+name = "windows-sys" -+version = "0.48.0" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" -+checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -+dependencies = [ -+ "windows-targets", -+] - - [[package]] --name = "winapi" --version = "0.3.9" -+name = "windows-targets" -+version = "0.48.1" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -+checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" - dependencies = [ -- "winapi-i686-pc-windows-gnu", -- "winapi-x86_64-pc-windows-gnu", -+ "windows_aarch64_gnullvm", -+ "windows_aarch64_msvc", -+ "windows_i686_gnu", -+ "windows_i686_msvc", -+ "windows_x86_64_gnu", -+ "windows_x86_64_gnullvm", -+ "windows_x86_64_msvc", - ] - - [[package]] --name = "winapi-i686-pc-windows-gnu" --version = "0.4.0" -+name = "windows_aarch64_gnullvm" -+version = "0.48.0" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" -+ -+[[package]] -+name = "windows_aarch64_msvc" -+version = "0.48.0" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" -+ -+[[package]] -+name = "windows_i686_gnu" -+version = "0.48.0" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" -+ -+[[package]] -+name = "windows_i686_msvc" -+version = "0.48.0" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -+checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - - [[package]] --name = "winapi-x86_64-pc-windows-gnu" --version = "0.4.0" -+name = "windows_x86_64_gnu" -+version = "0.48.0" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -+checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" -+ -+[[package]] -+name = "windows_x86_64_gnullvm" -+version = "0.48.0" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" -+ -+[[package]] -+name = "windows_x86_64_msvc" -+version = "0.48.0" -+source = "registry+https://github.com/rust-lang/crates.io-index" -+checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - - [[package]] - name = "xattr" --version = "0.2.2" -+version = "0.2.3" - source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" -+checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" - dependencies = [ - "libc", - ] -diff --git a/vendor/tar/Cargo.toml b/vendor/tar/Cargo.toml -index 23771b564918..6225b778f0d2 100644 ---- a/vendor/tar/Cargo.toml -+++ b/vendor/tar/Cargo.toml -@@ -12,23 +12,35 @@ - [package] - edition = "2018" - name = "tar" --version = "0.4.38" -+version = "0.4.39" - authors = ["Alex Crichton "] - exclude = ["tests/archives/*"] --description = "A Rust implementation of a TAR file reader and writer. This library does not\ncurrently handle compression, but it is abstract over all I/O readers and\nwriters. Additionally, great lengths are taken to ensure that the entire\ncontents are never required to be entirely resident in memory all at once.\n" -+description = """ -+A Rust implementation of a TAR file reader and writer. This library does not -+currently handle compression, but it is abstract over all I/O readers and -+writers. Additionally, great lengths are taken to ensure that the entire -+contents are never required to be entirely resident in memory all at once. -+""" - homepage = "https://github.com/alexcrichton/tar-rs" - documentation = "https://docs.rs/tar" - readme = "README.md" --keywords = ["tar", "tarfile", "encoding"] -+keywords = [ -+ "tar", -+ "tarfile", -+ "encoding", -+] - license = "MIT/Apache-2.0" - repository = "https://github.com/alexcrichton/tar-rs" -+ - [dependencies.filetime] - version = "0.2.8" -+ - [dev-dependencies.tempfile] - version = "3" - - [features] - default = ["xattr"] -+ - [target."cfg(unix)".dependencies.libc] - version = "0.2" - -diff --git a/vendor/tar/src/archive.rs b/vendor/tar/src/archive.rs -index 1bed5124909e..c7a9d9803231 100644 ---- a/vendor/tar/src/archive.rs -+++ b/vendor/tar/src/archive.rs -@@ -22,8 +22,10 @@ pub struct Archive { - - pub struct ArchiveInner { - pos: Cell, -+ mask: u32, - unpack_xattrs: bool, - preserve_permissions: bool, -+ preserve_ownerships: bool, - preserve_mtime: bool, - overwrite: bool, - ignore_zeros: bool, -@@ -52,8 +54,10 @@ impl Archive { - pub fn new(obj: R) -> Archive { - Archive { - inner: ArchiveInner { -+ mask: u32::MIN, - unpack_xattrs: false, - preserve_permissions: false, -+ preserve_ownerships: false, - preserve_mtime: true, - overwrite: true, - ignore_zeros: false, -@@ -106,6 +110,20 @@ impl Archive { - me._unpack(dst.as_ref()) - } - -+ /// Set the mask of the permission bits when unpacking this entry. -+ /// -+ /// The mask will be inverted when applying against a mode, similar to how -+ /// `umask` works on Unix. In logical notation it looks like: -+ /// -+ /// ```text -+ /// new_mode = old_mode & (~mask) -+ /// ``` -+ /// -+ /// The mask is 0 by default and is currently only implemented on Unix. -+ pub fn set_mask(&mut self, mask: u32) { -+ self.inner.mask = mask; -+ } -+ - /// Indicate whether extended file attributes (xattrs on Unix) are preserved - /// when unpacking this archive. - /// -@@ -126,6 +144,15 @@ impl Archive { - self.inner.preserve_permissions = preserve; - } - -+ /// Indicate whether numeric ownership ids (like uid and gid on Unix) -+ /// are preserved when unpacking this entry. -+ /// -+ /// This flag is disabled by default and is currently only implemented on -+ /// Unix. -+ pub fn set_preserve_ownerships(&mut self, preserve: bool) { -+ self.inner.preserve_ownerships = preserve; -+ } -+ - /// Indicate whether files and symlinks should be overwritten on extraction. - pub fn set_overwrite(&mut self, overwrite: bool) { - self.inner.overwrite = overwrite; -@@ -304,10 +331,12 @@ impl<'a> EntriesFields<'a> { - long_pathname: None, - long_linkname: None, - pax_extensions: None, -+ mask: self.archive.inner.mask, - unpack_xattrs: self.archive.inner.unpack_xattrs, - preserve_permissions: self.archive.inner.preserve_permissions, - preserve_mtime: self.archive.inner.preserve_mtime, - overwrite: self.archive.inner.overwrite, -+ preserve_ownerships: self.archive.inner.preserve_ownerships, - }; - - // Store where the next entry is, rounding up by 512 bytes (the size of -diff --git a/vendor/tar/src/entry.rs b/vendor/tar/src/entry.rs -index 8f0b62acfb07..c81554fcbfff 100644 ---- a/vendor/tar/src/entry.rs -+++ b/vendor/tar/src/entry.rs -@@ -31,6 +31,7 @@ pub struct EntryFields<'a> { - pub long_pathname: Option>, - pub long_linkname: Option>, - pub pax_extensions: Option>, -+ pub mask: u32, - pub header: Header, - pub size: u64, - pub header_pos: u64, -@@ -38,6 +39,7 @@ pub struct EntryFields<'a> { - pub data: Vec>, - pub unpack_xattrs: bool, - pub preserve_permissions: bool, -+ pub preserve_ownerships: bool, - pub preserve_mtime: bool, - pub overwrite: bool, - } -@@ -230,6 +232,20 @@ impl<'a, R: Read> Entry<'a, R> { - self.fields.unpack_in(dst.as_ref()) - } - -+ /// Set the mask of the permission bits when unpacking this entry. -+ /// -+ /// The mask will be inverted when applying against a mode, similar to how -+ /// `umask` works on Unix. In logical notation it looks like: -+ /// -+ /// ```text -+ /// new_mode = old_mode & (~mask) -+ /// ``` -+ /// -+ /// The mask is 0 by default and is currently only implemented on Unix. -+ pub fn set_mask(&mut self, mask: u32) { -+ self.fields.mask = mask; -+ } -+ - /// Indicate whether extended file attributes (xattrs on Unix) are preserved - /// when unpacking this entry. - /// -@@ -444,13 +460,51 @@ impl<'a> EntryFields<'a> { - - /// Returns access to the header of this entry in the archive. - fn unpack(&mut self, target_base: Option<&Path>, dst: &Path) -> io::Result { -+ fn set_perms_ownerships( -+ dst: &Path, -+ f: Option<&mut std::fs::File>, -+ header: &Header, -+ mask: u32, -+ perms: bool, -+ ownerships: bool, -+ ) -> io::Result<()> { -+ // ownerships need to be set first to avoid stripping SUID bits in the permissions ... -+ if ownerships { -+ set_ownerships(dst, &f, header.uid()?, header.gid()?)?; -+ } -+ // ... then set permissions, SUID bits set here is kept -+ if let Ok(mode) = header.mode() { -+ set_perms(dst, f, mode, mask, perms)?; -+ } -+ -+ Ok(()) -+ } -+ -+ fn get_mtime(header: &Header) -> Option { -+ header.mtime().ok().map(|mtime| { -+ // For some more information on this see the comments in -+ // `Header::fill_platform_from`, but the general idea is that -+ // we're trying to avoid 0-mtime files coming out of archives -+ // since some tools don't ingest them well. Perhaps one day -+ // when Cargo stops working with 0-mtime archives we can remove -+ // this. -+ let mtime = if mtime == 0 { 1 } else { mtime }; -+ FileTime::from_unix_time(mtime as i64, 0) -+ }) -+ } -+ - let kind = self.header.entry_type(); - - if kind.is_dir() { - self.unpack_dir(dst)?; -- if let Ok(mode) = self.header.mode() { -- set_perms(dst, None, mode, self.preserve_permissions)?; -- } -+ set_perms_ownerships( -+ dst, -+ None, -+ &self.header, -+ self.mask, -+ self.preserve_permissions, -+ self.preserve_ownerships, -+ )?; - return Ok(Unpacked::__Nonexhaustive); - } else if kind.is_hard_link() || kind.is_symlink() { - let src = match self.link_name()? { -@@ -522,7 +576,14 @@ impl<'a> EntryFields<'a> { - ), - ) - })?; -- }; -+ if self.preserve_mtime { -+ if let Some(mtime) = get_mtime(&self.header) { -+ filetime::set_symlink_file_times(dst, mtime, mtime).map_err(|e| { -+ TarError::new(format!("failed to set mtime for `{}`", dst.display()), e) -+ })?; -+ } -+ } -+ } - return Ok(Unpacked::__Nonexhaustive); - - #[cfg(target_arch = "wasm32")] -@@ -553,9 +614,14 @@ impl<'a> EntryFields<'a> { - // Only applies to old headers. - if self.header.as_ustar().is_none() && self.path_bytes().ends_with(b"/") { - self.unpack_dir(dst)?; -- if let Ok(mode) = self.header.mode() { -- set_perms(dst, None, mode, self.preserve_permissions)?; -- } -+ set_perms_ownerships( -+ dst, -+ None, -+ &self.header, -+ self.mask, -+ self.preserve_permissions, -+ self.preserve_ownerships, -+ )?; - return Ok(Unpacked::__Nonexhaustive); - } - -@@ -618,35 +684,105 @@ impl<'a> EntryFields<'a> { - })?; - - if self.preserve_mtime { -- if let Ok(mtime) = self.header.mtime() { -- // For some more information on this see the comments in -- // `Header::fill_platform_from`, but the general idea is that -- // we're trying to avoid 0-mtime files coming out of archives -- // since some tools don't ingest them well. Perhaps one day -- // when Cargo stops working with 0-mtime archives we can remove -- // this. -- let mtime = if mtime == 0 { 1 } else { mtime }; -- let mtime = FileTime::from_unix_time(mtime as i64, 0); -+ if let Some(mtime) = get_mtime(&self.header) { - filetime::set_file_handle_times(&f, Some(mtime), Some(mtime)).map_err(|e| { - TarError::new(format!("failed to set mtime for `{}`", dst.display()), e) - })?; - } - } -- if let Ok(mode) = self.header.mode() { -- set_perms(dst, Some(&mut f), mode, self.preserve_permissions)?; -- } -+ set_perms_ownerships( -+ dst, -+ Some(&mut f), -+ &self.header, -+ self.mask, -+ self.preserve_permissions, -+ self.preserve_ownerships, -+ )?; - if self.unpack_xattrs { - set_xattrs(self, dst)?; - } - return Ok(Unpacked::File(f)); - -+ fn set_ownerships( -+ dst: &Path, -+ f: &Option<&mut std::fs::File>, -+ uid: u64, -+ gid: u64, -+ ) -> Result<(), TarError> { -+ _set_ownerships(dst, f, uid, gid).map_err(|e| { -+ TarError::new( -+ format!( -+ "failed to set ownerships to uid={:?}, gid={:?} \ -+ for `{}`", -+ uid, -+ gid, -+ dst.display() -+ ), -+ e, -+ ) -+ }) -+ } -+ -+ #[cfg(unix)] -+ fn _set_ownerships( -+ dst: &Path, -+ f: &Option<&mut std::fs::File>, -+ uid: u64, -+ gid: u64, -+ ) -> io::Result<()> { -+ use std::convert::TryInto; -+ use std::os::unix::prelude::*; -+ -+ let uid: libc::uid_t = uid.try_into().map_err(|_| { -+ io::Error::new(io::ErrorKind::Other, format!("UID {} is too large!", uid)) -+ })?; -+ let gid: libc::gid_t = gid.try_into().map_err(|_| { -+ io::Error::new(io::ErrorKind::Other, format!("GID {} is too large!", gid)) -+ })?; -+ match f { -+ Some(f) => unsafe { -+ let fd = f.as_raw_fd(); -+ if libc::fchown(fd, uid, gid) != 0 { -+ Err(io::Error::last_os_error()) -+ } else { -+ Ok(()) -+ } -+ }, -+ None => unsafe { -+ let path = std::ffi::CString::new(dst.as_os_str().as_bytes()).map_err(|e| { -+ io::Error::new( -+ io::ErrorKind::Other, -+ format!("path contains null character: {:?}", e), -+ ) -+ })?; -+ if libc::lchown(path.as_ptr(), uid, gid) != 0 { -+ Err(io::Error::last_os_error()) -+ } else { -+ Ok(()) -+ } -+ }, -+ } -+ } -+ -+ // Windows does not support posix numeric ownership IDs -+ #[cfg(any(windows, target_arch = "wasm32"))] -+ fn _set_ownerships( -+ _: &Path, -+ _: &Option<&mut std::fs::File>, -+ _: u64, -+ _: u64, -+ ) -> io::Result<()> { -+ Ok(()) -+ } -+ - fn set_perms( - dst: &Path, - f: Option<&mut std::fs::File>, - mode: u32, -+ mask: u32, - preserve: bool, - ) -> Result<(), TarError> { -- _set_perms(dst, f, mode, preserve).map_err(|e| { -+ _set_perms(dst, f, mode, mask, preserve).map_err(|e| { - TarError::new( - format!( - "failed to set permissions to {:o} \ -@@ -664,11 +800,13 @@ impl<'a> EntryFields<'a> { - dst: &Path, - f: Option<&mut std::fs::File>, - mode: u32, -+ mask: u32, - preserve: bool, - ) -> io::Result<()> { - use std::os::unix::prelude::*; - - let mode = if preserve { mode } else { mode & 0o777 }; -+ let mode = mode & !mask; - let perm = fs::Permissions::from_mode(mode as _); - match f { - Some(f) => f.set_permissions(perm), -@@ -681,6 +819,7 @@ impl<'a> EntryFields<'a> { - dst: &Path, - f: Option<&mut std::fs::File>, - mode: u32, -+ _mask: u32, - _preserve: bool, - ) -> io::Result<()> { - if mode & 0o200 == 0o200 { -@@ -706,6 +845,7 @@ impl<'a> EntryFields<'a> { - dst: &Path, - f: Option<&mut std::fs::File>, - mode: u32, -+ mask: u32, - _preserve: bool, - ) -> io::Result<()> { - Err(io::Error::new(io::ErrorKind::Other, "Not implemented")) -diff --git a/vendor/tar/tests/all.rs b/vendor/tar/tests/all.rs -index 11103bd6b80e..8c5359c56621 100644 ---- a/vendor/tar/tests/all.rs -+++ b/vendor/tar/tests/all.rs -@@ -579,10 +579,21 @@ fn extracting_malicious_tarball() { - t!(a.append(&header, io::repeat(1).take(1))); - }; - append("/tmp/abs_evil.txt"); -- append("//tmp/abs_evil2.txt"); -+ // std parse `//` as UNC path, see rust-lang/rust#100833 -+ append( -+ #[cfg(not(windows))] -+ "//tmp/abs_evil2.txt", -+ #[cfg(windows)] -+ "C://tmp/abs_evil2.txt", -+ ); - append("///tmp/abs_evil3.txt"); - append("/./tmp/abs_evil4.txt"); -- append("//./tmp/abs_evil5.txt"); -+ append( -+ #[cfg(not(windows))] -+ "//./tmp/abs_evil5.txt", -+ #[cfg(windows)] -+ "C://./tmp/abs_evil5.txt", -+ ); - append("///./tmp/abs_evil6.txt"); - append("/../tmp/rel_evil.txt"); - append("../rel_evil2.txt"); -@@ -757,6 +768,40 @@ fn backslash_treated_well() { - assert!(fs::metadata(td.path().join("foo\\bar")).is_ok()); - } - -+#[test] -+#[cfg(unix)] -+fn set_mask() { -+ use ::std::os::unix::fs::PermissionsExt; -+ let mut ar = tar::Builder::new(Vec::new()); -+ -+ let mut header = tar::Header::new_gnu(); -+ header.set_size(0); -+ header.set_entry_type(tar::EntryType::Regular); -+ t!(header.set_path("foo")); -+ header.set_mode(0o777); -+ header.set_cksum(); -+ t!(ar.append(&header, &[][..])); -+ -+ let mut header = tar::Header::new_gnu(); -+ header.set_size(0); -+ header.set_entry_type(tar::EntryType::Regular); -+ t!(header.set_path("bar")); -+ header.set_mode(0o421); -+ header.set_cksum(); -+ t!(ar.append(&header, &[][..])); -+ -+ let td = t!(TempBuilder::new().prefix("tar-rs").tempdir()); -+ let bytes = t!(ar.into_inner()); -+ let mut ar = tar::Archive::new(&bytes[..]); -+ ar.set_mask(0o211); -+ t!(ar.unpack(td.path())); -+ -+ let md = t!(fs::metadata(td.path().join("foo"))); -+ assert_eq!(md.permissions().mode(), 0o100566); -+ let md = t!(fs::metadata(td.path().join("bar"))); -+ assert_eq!(md.permissions().mode(), 0o100420); -+} -+ - #[cfg(unix)] - #[test] - fn nul_bytes_in_path() { -@@ -792,6 +837,10 @@ fn unpack_links() { - - let md = t!(fs::symlink_metadata(td.path().join("lnk"))); - assert!(md.file_type().is_symlink()); -+ -+ let mtime = FileTime::from_last_modification_time(&md); -+ assert_eq!(mtime.unix_seconds(), 1448291033); -+ - assert_eq!( - &*t!(fs::read_link(td.path().join("lnk"))), - Path::new("file") -@@ -1385,3 +1434,57 @@ fn header_size_overflow() { - err - ); - } -+ -+#[test] -+#[cfg(unix)] -+fn ownership_preserving() { -+ use std::os::unix::prelude::*; -+ -+ let mut rdr = Vec::new(); -+ let mut ar = Builder::new(&mut rdr); -+ let data: &[u8] = &[]; -+ let mut header = Header::new_gnu(); -+ // file 1 with uid = 580800000, gid = 580800000 -+ header.set_gid(580800000); -+ header.set_uid(580800000); -+ t!(header.set_path("iamuid580800000")); -+ header.set_size(0); -+ header.set_cksum(); -+ t!(ar.append(&header, data)); -+ // file 2 with uid = 580800001, gid = 580800000 -+ header.set_uid(580800001); -+ t!(header.set_path("iamuid580800001")); -+ header.set_cksum(); -+ t!(ar.append(&header, data)); -+ // file 3 with uid = 580800002, gid = 580800002 -+ header.set_gid(580800002); -+ header.set_uid(580800002); -+ t!(header.set_path("iamuid580800002")); -+ header.set_cksum(); -+ t!(ar.append(&header, data)); -+ t!(ar.finish()); -+ -+ let rdr = Cursor::new(t!(ar.into_inner())); -+ let td = t!(TempBuilder::new().prefix("tar-rs").tempdir()); -+ let mut ar = Archive::new(rdr); -+ ar.set_preserve_ownerships(true); -+ -+ if unsafe { libc::getuid() } == 0 { -+ assert!(ar.unpack(td.path()).is_ok()); -+ // validate against premade files -+ // iamuid580800001 has this ownership: 580800001:580800000 -+ let meta = std::fs::metadata(td.path().join("iamuid580800000")).unwrap(); -+ assert_eq!(meta.uid(), 580800000); -+ assert_eq!(meta.gid(), 580800000); -+ let meta = std::fs::metadata(td.path().join("iamuid580800001")).unwrap(); -+ assert_eq!(meta.uid(), 580800001); -+ assert_eq!(meta.gid(), 580800000); -+ let meta = std::fs::metadata(td.path().join("iamuid580800002")).unwrap(); -+ assert_eq!(meta.uid(), 580800002); -+ assert_eq!(meta.gid(), 580800002); -+ } else { -+ // it's not possible to unpack tar while preserving ownership -+ // without root permissions -+ assert!(ar.unpack(td.path()).is_err()); -+ } -+} -diff --git a/vendor/tar/tests/entry.rs b/vendor/tar/tests/entry.rs -index fa8eeaee726d..62df663e8d18 100644 ---- a/vendor/tar/tests/entry.rs -+++ b/vendor/tar/tests/entry.rs -@@ -180,6 +180,37 @@ fn directory_maintains_permissions() { - assert_eq!(md.permissions().mode(), 0o40777); - } - -+#[test] -+#[cfg(unix)] -+fn set_entry_mask() { -+ use ::std::os::unix::fs::PermissionsExt; -+ -+ let mut ar = tar::Builder::new(Vec::new()); -+ -+ let mut header = tar::Header::new_gnu(); -+ header.set_size(0); -+ header.set_entry_type(tar::EntryType::Regular); -+ t!(header.set_path("foo")); -+ header.set_mode(0o777); -+ header.set_cksum(); -+ t!(ar.append(&header, &[][..])); -+ -+ let bytes = t!(ar.into_inner()); -+ let mut ar = tar::Archive::new(&bytes[..]); -+ let td = t!(Builder::new().prefix("tar").tempdir()); -+ let foo_path = td.path().join("foo"); -+ -+ let mut entries = t!(ar.entries()); -+ let mut foo = t!(entries.next().unwrap()); -+ foo.set_mask(0o027); -+ t!(foo.unpack(&foo_path)); -+ -+ let f = t!(File::open(foo_path)); -+ let md = t!(f.metadata()); -+ assert!(md.is_file()); -+ assert_eq!(md.permissions().mode(), 0o100750); -+} -+ - #[test] - #[cfg(not(windows))] // dangling symlinks have weird permissions - fn modify_link_just_created() { --- -2.41.0 - diff --git a/SOURCES/rustc-1.61.0-rust-gdb-substitute-path.patch b/SOURCES/rustc-1.61.0-rust-gdb-substitute-path.patch deleted file mode 100644 index b94e23e..0000000 --- a/SOURCES/rustc-1.61.0-rust-gdb-substitute-path.patch +++ /dev/null @@ -1,18 +0,0 @@ ---- rustc-1.61.0-src/src/etc/rust-gdb.orig 2022-05-17 18:29:36.000000000 -0700 -+++ rustc-1.61.0-src/src/etc/rust-gdb 2022-05-18 11:18:13.732709661 -0700 -@@ -14,6 +14,9 @@ fi - RUSTC_SYSROOT="$("$RUSTC" --print=sysroot)" - GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc" - -+RUST_STD_BUILD="@BUILDDIR@/library/" -+RUST_STD_SRC="$RUSTC_SYSROOT/lib/rustlib/src/rust/library/" -+ - # Run GDB with the additional arguments that load the pretty printers - # Set the environment variable `RUST_GDB` to overwrite the call to a - # different/specific command (defaults to `gdb`). -@@ -21,4 +24,5 @@ RUST_GDB="${RUST_GDB:-gdb}" - PYTHONPATH="$PYTHONPATH:$GDB_PYTHON_MODULE_DIRECTORY" exec ${RUST_GDB} \ - --directory="$GDB_PYTHON_MODULE_DIRECTORY" \ - -iex "add-auto-load-safe-path $GDB_PYTHON_MODULE_DIRECTORY" \ -+ -iex "set substitute-path $RUST_STD_BUILD $RUST_STD_SRC" \ - "$@" diff --git a/SOURCES/rustc-1.65.0-disable-libssh2.patch b/SOURCES/rustc-1.65.0-disable-libssh2.patch deleted file mode 100644 index 24be1f3..0000000 --- a/SOURCES/rustc-1.65.0-disable-libssh2.patch +++ /dev/null @@ -1,43 +0,0 @@ ---- rustc-beta-src/Cargo.lock.orig 2022-09-24 10:20:14.000000000 -0700 -+++ rustc-beta-src/Cargo.lock 2022-10-04 10:26:35.490270607 -0700 -@@ -1971,7 +1971,6 @@ - dependencies = [ - "cc", - "libc", -- "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -@@ -2004,20 +2003,6 @@ - ] - - [[package]] --name = "libssh2-sys" --version = "0.2.23" --source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" --dependencies = [ -- "cc", -- "libc", -- "libz-sys", -- "openssl-sys", -- "pkg-config", -- "vcpkg", --] -- --[[package]] - name = "libz-sys" - version = "1.1.3" - source = "registry+https://github.com/rust-lang/crates.io-index" ---- rustc-beta-src/vendor/git2/Cargo.toml.orig 2022-10-04 10:26:35.490270607 -0700 -+++ rustc-beta-src/vendor/git2/Cargo.toml 2022-10-04 10:28:14.002187686 -0700 -@@ -58,9 +58,7 @@ - - [features] - default = [ -- "ssh", - "https", -- "ssh_key_from_memory", - ] - https = [ - "libgit2-sys/https", diff --git a/SOURCES/rustc-1.65.0-no-default-pie.patch b/SOURCES/rustc-1.65.0-no-default-pie.patch deleted file mode 100644 index 2a69611..0000000 --- a/SOURCES/rustc-1.65.0-no-default-pie.patch +++ /dev/null @@ -1,43 +0,0 @@ ---- rustc-beta-src/compiler/rustc_codegen_ssa/src/back/link.rs.orig 2022-09-24 10:20:14.000000000 -0700 -+++ rustc-beta-src/compiler/rustc_codegen_ssa/src/back/link.rs 2022-10-05 11:24:21.759564185 -0700 -@@ -755,7 +755,7 @@ - && cmd.get_args().iter().any(|e| e.to_string_lossy() == "-no-pie") - { - info!("linker output: {:?}", out); -- warn!("Linker does not support -no-pie command line option. Retrying without."); -+ info!("Linker does not support -no-pie command line option. Retrying without."); - for arg in cmd.take_args() { - if arg.to_string_lossy() != "-no-pie" { - cmd.arg(arg); -@@ -774,7 +774,7 @@ - && cmd.get_args().iter().any(|e| e.to_string_lossy() == "-static-pie") - { - info!("linker output: {:?}", out); -- warn!( -+ info!( - "Linker does not support -static-pie command line option. Retrying with -static instead." - ); - // Mirror `add_(pre,post)_link_objects` to replace CRT objects. -@@ -1520,15 +1520,15 @@ - } - - fn link_output_kind(sess: &Session, crate_type: CrateType) -> LinkOutputKind { -- let kind = match (crate_type, sess.crt_static(Some(crate_type)), sess.relocation_model()) { -+ // Only use PIE if explicitly specified. -+ #[allow(rustc::bad_opt_access)] -+ let explicit_pic = -+ matches!(sess.opts.cg.relocation_model, Some(RelocModel::Pic | RelocModel::Pie)); -+ let kind = match (crate_type, sess.crt_static(Some(crate_type)), explicit_pic) { - (CrateType::Executable, _, _) if sess.is_wasi_reactor() => LinkOutputKind::WasiReactorExe, -- (CrateType::Executable, false, RelocModel::Pic | RelocModel::Pie) => { -- LinkOutputKind::DynamicPicExe -- } -+ (CrateType::Executable, false, true) => LinkOutputKind::DynamicPicExe, - (CrateType::Executable, false, _) => LinkOutputKind::DynamicNoPicExe, -- (CrateType::Executable, true, RelocModel::Pic | RelocModel::Pie) => { -- LinkOutputKind::StaticPicExe -- } -+ (CrateType::Executable, true, true) => LinkOutputKind::StaticPicExe, - (CrateType::Executable, true, _) => LinkOutputKind::StaticNoPicExe, - (_, true, _) => LinkOutputKind::StaticDylib, - (_, false, _) => LinkOutputKind::DynamicDylib, diff --git a/SOURCES/rustc-1.70.0-rust-gdb-substitute-path.patch b/SOURCES/rustc-1.70.0-rust-gdb-substitute-path.patch new file mode 100644 index 0000000..e9e5e2e --- /dev/null +++ b/SOURCES/rustc-1.70.0-rust-gdb-substitute-path.patch @@ -0,0 +1,21 @@ +diff --git a/src/etc/rust-gdb b/src/etc/rust-gdb +index 9abed30ea6f7..e4bf55df3688 100755 +--- a/src/etc/rust-gdb ++++ b/src/etc/rust-gdb +@@ -13,8 +13,6 @@ fi + # Find out where the pretty printer Python module is + RUSTC_SYSROOT="$("$RUSTC" --print=sysroot)" + GDB_PYTHON_MODULE_DIRECTORY="$RUSTC_SYSROOT/lib/rustlib/etc" +-# Get the commit hash for path remapping +-RUSTC_COMMIT_HASH="$("$RUSTC" -vV | sed -n 's/commit-hash: \([a-zA-Z0-9_]*\)/\1/p')" + + # Run GDB with the additional arguments that load the pretty printers + # Set the environment variable `RUST_GDB` to overwrite the call to a +@@ -23,6 +21,6 @@ RUST_GDB="${RUST_GDB:-gdb}" + PYTHONPATH="$PYTHONPATH:$GDB_PYTHON_MODULE_DIRECTORY" exec ${RUST_GDB} \ + --directory="$GDB_PYTHON_MODULE_DIRECTORY" \ + -iex "add-auto-load-safe-path $GDB_PYTHON_MODULE_DIRECTORY" \ +- -iex "set substitute-path /rustc/$RUSTC_COMMIT_HASH $RUSTC_SYSROOT/lib/rustlib/src/rust" \ ++ -iex "set substitute-path @BUILDDIR@ $RUSTC_SYSROOT/lib/rustlib/src/rust" \ + "$@" + diff --git a/SOURCES/rustc-1.65.0-disable-http2.patch b/SOURCES/rustc-1.71.0-disable-http2.patch similarity index 63% rename from SOURCES/rustc-1.65.0-disable-http2.patch rename to SOURCES/rustc-1.71.0-disable-http2.patch index 99e33c7..34fdab3 100644 --- a/SOURCES/rustc-1.65.0-disable-http2.patch +++ b/SOURCES/rustc-1.71.0-disable-http2.patch @@ -1,6 +1,6 @@ ---- rustc-beta-src/Cargo.lock.orig 2022-10-04 10:55:48.797517289 -0700 -+++ rustc-beta-src/Cargo.lock 2022-10-04 10:55:48.799517248 -0700 -@@ -1026,7 +1026,6 @@ +--- rustc-beta-src/src/tools/cargo/Cargo.lock.orig 2023-07-07 17:30:04.817452621 -0700 ++++ rustc-beta-src/src/tools/cargo/Cargo.lock 2023-07-07 17:30:27.777988139 -0700 +@@ -734,7 +734,6 @@ dependencies = [ "cc", "libc", @@ -8,14 +8,14 @@ "libz-sys", "openssl-sys", "pkg-config", -@@ -1993,16 +1992,6 @@ - checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a" +@@ -1954,16 +1953,6 @@ + checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" [[package]] -name = "libnghttp2-sys" --version = "0.1.4+1.41.0" +-version = "0.1.7+1.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" --checksum = "03624ec6df166e79e139a2310ca213283d6b3c30810c54844f307086d4488df1" +-checksum = "57ed28aba195b38d5ff02b9170cbff627e336a20925e43b4945390401c5dc93f" -dependencies = [ - "cc", - "libc", @@ -23,43 +23,22 @@ - -[[package]] name = "libz-sys" - version = "1.1.3" + version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" ---- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2022-10-04 10:55:48.799517248 -0700 -+++ rustc-beta-src/src/tools/cargo/Cargo.toml 2022-10-04 11:00:55.057162743 -0700 -@@ -21,7 +21,7 @@ - cargo-platform = { path = "crates/cargo-platform", version = "0.1.2" } - cargo-util = { path = "crates/cargo-util", version = "0.2.1" } - crates-io = { path = "crates/crates-io", version = "0.34.0" } --curl = { version = "0.4.43", features = ["http2"] } -+curl = { version = "0.4.43", features = [] } - curl-sys = "0.4.55" - env_logger = "0.9.0" - pretty_env_logger = { version = "0.4", optional = true } ---- rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs.orig 2022-09-24 10:23:17.000000000 -0700 -+++ rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs 2022-10-04 10:55:48.799517248 -0700 -@@ -192,16 +192,8 @@ - } - self.fetch_started = true; - -- // We've enabled the `http2` feature of `curl` in Cargo, so treat -- // failures here as fatal as it would indicate a build-time problem. -- self.multiplexing = self.config.http_config()?.multiplexing.unwrap_or(true); -- -- self.multi -- .pipelining(false, self.multiplexing) -- .with_context(|| "failed to enable multiplexing/pipelining in curl")?; -- -- // let's not flood the server with connections -- self.multi.set_max_host_connections(2)?; -+ // Multiplexing is disabled because the system libcurl doesn't support it. -+ self.multiplexing = false; - - self.config - .shell() ---- rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs.orig 2022-09-24 10:23:17.000000000 -0700 -+++ rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs 2022-10-04 10:55:48.800517227 -0700 -@@ -403,16 +403,9 @@ +--- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2023-07-07 17:30:04.819452581 -0700 ++++ rustc-beta-src/src/tools/cargo/Cargo.toml 2023-07-07 17:30:24.133061874 -0700 +@@ -118,7 +118,7 @@ + cargo-util.workspace = true + clap = { workspace = true, features = ["wrap_help"] } + crates-io.workspace = true +-curl = { workspace = true, features = ["http2"] } ++curl = { workspace = true, features = [] } + curl-sys.workspace = true + env_logger.workspace = true + filetime.workspace = true +--- rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs.orig 2023-06-24 10:27:37.000000000 -0700 ++++ rustc-beta-src/src/tools/cargo/src/cargo/core/package.rs 2023-07-07 17:30:04.819452581 -0700 +@@ -407,16 +407,9 @@ sources: SourceMap<'cfg>, config: &'cfg Config, ) -> CargoResult> { @@ -79,7 +58,30 @@ Ok(PackageSet { packages: package_ids -@@ -658,7 +651,7 @@ +--- rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs.orig 2023-06-24 10:27:37.000000000 -0700 ++++ rustc-beta-src/src/tools/cargo/src/cargo/sources/registry/http_remote.rs 2023-07-07 17:30:04.819452581 -0700 +@@ -229,16 +229,8 @@ + } + self.fetch_started = true; + +- // We've enabled the `http2` feature of `curl` in Cargo, so treat +- // failures here as fatal as it would indicate a build-time problem. +- self.multiplexing = self.config.http_config()?.multiplexing.unwrap_or(true); +- +- self.multi +- .pipelining(false, self.multiplexing) +- .with_context(|| "failed to enable multiplexing/pipelining in curl")?; +- +- // let's not flood the server with connections +- self.multi.set_max_host_connections(2)?; ++ // Multiplexing is disabled because the system libcurl doesn't support it. ++ self.multiplexing = false; + + if !self.quiet { + self.config +--- rustc-beta-src/src/tools/cargo/src/cargo/util/network/mod.rs.orig 2023-06-24 10:27:37.000000000 -0700 ++++ rustc-beta-src/src/tools/cargo/src/cargo/util/network/mod.rs 2023-07-07 17:30:04.819452581 -0700 +@@ -26,7 +26,7 @@ macro_rules! try_old_curl { ($e:expr, $msg:expr) => { let result = $e; diff --git a/SOURCES/rustc-1.71.0-disable-libssh2.patch b/SOURCES/rustc-1.71.0-disable-libssh2.patch new file mode 100644 index 0000000..ba61454 --- /dev/null +++ b/SOURCES/rustc-1.71.0-disable-libssh2.patch @@ -0,0 +1,42 @@ +--- rustc-beta-src/src/tools/cargo/Cargo.lock.orig 2023-06-24 10:27:37.000000000 -0700 ++++ rustc-beta-src/src/tools/cargo/Cargo.lock 2023-07-07 17:12:23.406932870 -0700 +@@ -1942,7 +1942,6 @@ + dependencies = [ + "cc", + "libc", +- "libssh2-sys", + "libz-sys", + "openssl-sys", + "pkg-config", +@@ -1965,20 +1964,6 @@ + ] + + [[package]] +-name = "libssh2-sys" +-version = "0.3.0" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" +-dependencies = [ +- "cc", +- "libc", +- "libz-sys", +- "openssl-sys", +- "pkg-config", +- "vcpkg", +-] +- +-[[package]] + name = "libz-sys" + version = "1.1.8" + source = "registry+https://github.com/rust-lang/crates.io-index" +--- rustc-beta-src/src/tools/cargo/Cargo.toml.orig 2023-06-24 10:27:37.000000000 -0700 ++++ rustc-beta-src/src/tools/cargo/Cargo.toml 2023-07-07 17:12:00.688392750 -0700 +@@ -31,7 +31,7 @@ + filetime = "0.2.9" + flate2 = { version = "1.0.3", default-features = false, features = ["zlib"] } + fwdansi = "1.1.0" +-git2 = "0.17.1" ++git2 = { version = "0.17.1", default-features = false, features = ["https"] } + git2-curl = "0.18.0" + gix = { version = "0.44.1", default-features = false, features = ["blocking-http-transport-curl", "progress-tree"] } + gix-features-for-configuration-only = { version = "0.29.0", package = "gix-features", features = [ "parallel" ] } diff --git a/SPECS/rust.spec b/SPECS/rust.spec index fc82bff..05c4277 100644 --- a/SPECS/rust.spec +++ b/SPECS/rust.spec @@ -1,4 +1,4 @@ -# Only x86_64 and i686 are Tier 1 platforms at this time. +# Only x86_64, i686, and aarch64 are Tier 1 platforms at this time. # https://doc.rust-lang.org/nightly/rustc/platform-support.html %global rust_arches x86_64 i686 aarch64 ppc64le s390x @@ -8,9 +8,9 @@ # To bootstrap from scratch, set the channel and date from src/stage0.json # e.g. 1.59.0 wants rustc: 1.58.0-2022-01-13 # or nightly wants some beta-YYYY-MM-DD -%global bootstrap_version 1.65.0 -%global bootstrap_channel 1.65.0 -%global bootstrap_date 2022-11-03 +%global bootstrap_version 1.70.0 +%global bootstrap_channel 1.70.0 +%global bootstrap_date 2023-06-01 # Only the specified arches will use bootstrap binaries. # NOTE: Those binaries used to be uploaded with every new release, but that was @@ -35,7 +35,7 @@ # src/ci/docker/host-x86_64/dist-various-2/build-wasi-toolchain.sh # (updated per https://github.com/rust-lang/rust/pull/96907) %global wasi_libc_url https://github.com/WebAssembly/wasi-libc -%global wasi_libc_ref wasi-sdk-17 +%global wasi_libc_ref wasi-sdk-20 %global wasi_libc_name wasi-libc-%{wasi_libc_ref} %global wasi_libc_source %{wasi_libc_url}/archive/%{wasi_libc_ref}/%{wasi_libc_name}.tar.gz %global wasi_libc_dir %{_builddir}/%{wasi_libc_name} @@ -44,17 +44,17 @@ %bcond_with llvm_static # We can also choose to just use Rust's bundled LLVM, in case the system LLVM -# is insufficient. Rust currently requires LLVM 12.0+. -%global min_llvm_version 13.0.0 -%global bundled_llvm_version 15.0.2 +# is insufficient. Rust currently requires LLVM 14.0+. +%global min_llvm_version 14.0.0 +%global bundled_llvm_version 16.0.5 %bcond_with bundled_llvm -# Requires stable libgit2 1.5, and not the next minor soname change. +# Requires stable libgit2 1.6, and not the next minor soname change. # This needs to be consistent with the bindings in vendor/libgit2-sys. -%global min_libgit2_version 1.5.0 -%global next_libgit2_version 1.6.0~ -%global bundled_libgit2_version 1.5.0 -%if 0%{?fedora} >= 99 +%global min_libgit2_version 1.6.4 +%global next_libgit2_version 1.7.0~ +%global bundled_libgit2_version 1.6.4 +%if 0%{?fedora} >= 38 %bcond_with bundled_libgit2 %else %bcond_without bundled_libgit2 @@ -83,8 +83,8 @@ %endif Name: rust -Version: 1.66.1 -Release: 2%{?dist} +Version: 1.71.1 +Release: 1%{?dist} Summary: The Rust Programming Language License: (ASL 2.0 or MIT) and (BSD and MIT) # ^ written as: (rust itself) and (bundled libraries) @@ -104,19 +104,18 @@ Source1: %{wasi_libc_source} Patch1: 0001-Use-lld-provided-by-system-for-wasm.patch # Set a substitute-path in rust-gdb for standard library sources. -Patch2: rustc-1.61.0-rust-gdb-substitute-path.patch +Patch2: rustc-1.70.0-rust-gdb-substitute-path.patch -# https://github.com/rust-lang/rust/pull/103072 -Patch3: 0001-compiletest-set-the-dylib-path-when-gathering-target.patch +# Override default target CPUs to match distro settings +# TODO: upstream this ability into the actual build configuration +Patch3: 0001-Let-environment-variables-override-some-default-CPUs.patch -# https://github.com/rust-lang/rust/pull/104001 -Patch4: 0001-Improve-generating-Custom-entry-function.patch +# Enable the profiler runtime for native hosts +# https://github.com/rust-lang/rust/pull/114069 +Patch4: 0001-Allow-using-external-builds-of-the-compiler-rt-profi.patch -# https://github.com/rust-lang/rust/pull/105468 -Patch5: 0001-Mangle-main-as-__main_void-on-wasm32-wasi.patch - -# CVE-2023-38497: cargo does not respect the umask when extracting dependencies -Patch6: CVE-2023-38497-cargo-umask.patch +# https://github.com/rust-lang/rust/pull/114440 +Patch5: 0001-bootstrap-config-fix-version-comparison-bug.patch ### RHEL-specific patches below ### @@ -124,16 +123,11 @@ Patch6: CVE-2023-38497-cargo-umask.patch Source100: macros.rust-toolset # Disable cargo->libgit2->libssh2 on RHEL, as it's not approved for FIPS (rhbz1732949) -Patch100: rustc-1.65.0-disable-libssh2.patch +Patch100: rustc-1.71.0-disable-libssh2.patch # libcurl on RHEL7 doesn't have http2, but since cargo requests it, curl-sys # will try to build it statically -- instead we turn off the feature. -Patch101: rustc-1.65.0-disable-http2.patch - -# kernel rh1410097 causes too-small stacks for PIE. -# (affects RHEL6 kernels when building for RHEL7) -Patch102: rustc-1.65.0-no-default-pie.patch - +Patch101: rustc-1.71.0-disable-http2.patch # Get the Rust triple for any arch. %{lua: function rust_triple(arch) @@ -151,7 +145,14 @@ Patch102: rustc-1.65.0-no-default-pie.patch return arch.."-unknown-linux-"..abi end} +# Get the environment form of a Rust triple +%{lua: function rust_triple_env(triple) + local sub = string.gsub(triple, "-", "_") + return string.upper(sub) +end} + %global rust_triple %{lua: print(rust_triple(rpm.expand("%{_target_cpu}")))} +%global rust_triple_env %{lua: print(rust_triple_env(rpm.expand("%{rust_triple}")))} %if %defined bootstrap_arches # For each bootstrap arch, add an additional binary Source. @@ -227,7 +228,7 @@ Provides: bundled(llvm) = %{bundled_llvm_version} %else BuildRequires: cmake >= 2.8.11 %if 0%{?epel} == 7 -%global llvm llvm13 +%global llvm llvm14 %endif %if %defined llvm %global llvm_root %{_libdir}/%{llvm} @@ -264,7 +265,7 @@ Requires: %{name}-std-static%{?_isa} = %{version}-%{release} Requires: /usr/bin/cc %if 0%{?epel} == 7 -%global devtoolset_name devtoolset-9 +%global devtoolset_name devtoolset-11 BuildRequires: %{devtoolset_name}-binutils BuildRequires: %{devtoolset_name}-gcc BuildRequires: %{devtoolset_name}-gcc-c++ @@ -329,6 +330,15 @@ find '%{buildroot}%{rustlibdir}'/wasm*/lib -type f -regex '.*\\.\\(a\\|rlib\\)' %{nil} %endif +%if 0%{?fedora} || 0%{?rhel} >= 8 +# For profiler_builtins +BuildRequires: compiler-rt +%endif + +# This component was removed as of Rust 1.69.0. +# https://github.com/rust-lang/rust/pull/101841 +Obsoletes: %{name}-analysis < 1.69.0~ + %description Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety. @@ -338,8 +348,9 @@ This package includes the Rust compiler and documentation generator. %package std-static Summary: Standard library for Rust +Provides: %{name}-std-static-%{rust_triple} = %{version}-%{release} Requires: %{name} = %{version}-%{release} -Requires: glibc-devel%{?_isa} >= 2.11 +Requires: glibc-devel%{?_isa} >= 2.17 %description std-static This package includes the standard libraries for building applications @@ -542,26 +553,13 @@ This package includes source files for the Rust standard library. It may be useful as a reference for code completion tools in various editors. -%package analysis -Summary: Compiler analysis data for the Rust standard library -%if 0%{?rhel} && 0%{?rhel} < 8 -Requires: %{name}-std-static%{?_isa} = %{version}-%{release} -%else -Recommends: %{name}-std-static%{?_isa} = %{version}-%{release} -%endif - -%description analysis -This package contains analysis data files produced with rustc's -Zsave-analysis -feature for the Rust standard library. The RLS (Rust Language Server) uses this -data to provide information about the Rust standard library. - - -%if 0%{?rhel} && 0%{?rhel} >= 8 +%if 0%{?rhel} %package toolset Summary: Rust Toolset -Requires: rust%{?_isa} = %{version}-%{release} -Requires: cargo%{?_isa} = %{version}-%{release} +BuildArch: noarch +Requires: rust = %{version}-%{release} +Requires: cargo = %{version}-%{release} %description toolset This is the metapackage for Rust Toolset, bringing in the Rust compiler, @@ -590,24 +588,19 @@ test -f '%{local_rust_root}/bin/rustc' %setup -q -n %{rustc_package} -%patch1 -p1 -%patch2 -p1 -%patch3 -p1 -%patch4 -p1 -%patch5 -p1 -%patch6 -p1 +%patch -P1 -p1 +%patch -P2 -p1 +%patch -P3 -p1 +%patch -P4 -p1 +%patch -P5 -p1 %if %with disabled_libssh2 -%patch100 -p1 +%patch -P100 -p1 %endif %if %without curl_http2 -%patch101 -p1 -rm -rf vendor/libnghttp2-sys/ -%endif - -%if 0%{?rhel} && 0%{?rhel} < 8 -%patch102 -p1 +%patch -P101 -p1 +rm -rf vendor/libnghttp2-sys*/ %endif # Use our explicit python3 first @@ -622,21 +615,21 @@ mkdir -p src/llvm-project/libunwind/ %endif # Remove other unused vendored libraries -rm -rf vendor/curl-sys/curl/ +rm -rf vendor/curl-sys*/curl/ rm -rf vendor/*jemalloc-sys*/jemalloc/ -rm -rf vendor/libmimalloc-sys/c_src/mimalloc/ -rm -rf vendor/libssh2-sys/libssh2/ -rm -rf vendor/libz-sys/src/zlib/ -rm -rf vendor/libz-sys/src/zlib-ng/ -rm -rf vendor/lzma-sys/xz-*/ -rm -rf vendor/openssl-src/openssl/ +rm -rf vendor/libffi-sys*/libffi/ +rm -rf vendor/libmimalloc-sys*/c_src/mimalloc/ +rm -rf vendor/libssh2-sys*/libssh2/ +rm -rf vendor/libz-sys*/src/zlib{,-ng}/ +rm -rf vendor/lzma-sys*/xz-*/ +rm -rf vendor/openssl-src*/openssl/ %if %without bundled_libgit2 -rm -rf vendor/libgit2-sys/libgit2/ +rm -rf vendor/libgit2-sys*/libgit2/ %endif %if %with disabled_libssh2 -rm -rf vendor/libssh2-sys/ +rm -rf vendor/libssh2-sys*/ %endif # This only affects the transient rust-installer, but let it use our dynamic xz-libs @@ -665,9 +658,28 @@ find vendor -name .cargo-checksum.json \ # it's a shebang and make them executable. Then brp-mangle-shebangs gets upset... find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' +# The distro flags are only appropriate for the host, not our cross-targets, +# and they're not as fine-grained as the settings we choose for std vs rustc. +%if %defined build_rustflags +%global build_rustflags %{nil} +%endif + +# These are similar to __cflags_arch_* in /usr/lib/rpm/redhat/macros +%{lua: function rustc_target_cpus() + local fedora = tonumber(rpm.expand("0%{?fedora}")) + local rhel = tonumber(rpm.expand("0%{?rhel}")) + local env = + " RUSTC_TARGET_CPU_X86_64=x86-64" .. ((rhel >= 10) and "-v3" or (rhel == 9) and "-v2" or "") + .. " RUSTC_TARGET_CPU_PPC64LE=" .. ((rhel >= 9) and "pwr9" or "pwr8") + .. " RUSTC_TARGET_CPU_S390X=" .. + ((rhel >= 9) and "z14" or (rhel == 8 or fedora >= 38) and "z13" or + (fedora >= 26) and "zEC12" or (rhel == 7) and "z196" or "z10") + return env +end} + # Set up shared environment variables for build/install/check -%global rust_env %{?rustflags:RUSTFLAGS="%{rustflags}"} -%if 0%{?cmake_path:1} +%global rust_env %{?rustflags:RUSTFLAGS="%{rustflags}"} %{lua: print(rustc_target_cpus())} +%if %defined cmake_path %global rust_env %{?rust_env} PATH="%{cmake_path}:$PATH" %endif %if %without disabled_libssh2 @@ -676,7 +688,6 @@ find -name '*.rs' -type f -perm /111 -exec chmod -v -x '{}' '+' %endif %global export_rust_env %{?rust_env:export %{rust_env}} - %build %{export_rust_env} @@ -737,6 +748,12 @@ end} end} %endif +%if 0%{?fedora} || 0%{?rhel} >= 8 +# The exact profiler path is version dependent, and uses LLVM-specific +# arch names in the filename, but this find is good enough for now... +PROFILER=$(find %{_libdir}/clang -type f -name 'libclang_rt.profile-*.a') +%endif + %configure --disable-option-checking \ --libdir=%{common_libdir} \ --build=%{rust_triple} --host=%{rust_triple} --target=%{rust_triple} \ @@ -745,6 +762,7 @@ end} --set target.%{rust_triple}.cxx=%{__cxx} \ --set target.%{rust_triple}.ar=%{__ar} \ --set target.%{rust_triple}.ranlib=%{__ranlib} \ + ${PROFILER:+--set target.%{rust_triple}.profiler="$PROFILER"} \ %{?mingw_target_config} \ %{?wasm_target_config} \ --python=%{__python3} \ @@ -762,7 +780,7 @@ end} --set build.install-stage=2 \ --set build.test-stage=2 \ --enable-extended \ - --tools=analysis,cargo,clippy,rls,rust-analyzer,rustfmt,src \ + --tools=cargo,clippy,rls,rust-analyzer,rustfmt,src \ --enable-vendor \ --enable-verbose-tests \ --dist-compression-formats=gz \ @@ -777,6 +795,9 @@ for triple in %{?mingw_targets} %{?wasm_targets}; do done %install +%if 0%{?rhel} && 0%{?rhel} <= 9 +%{?set_build_flags} +%endif %{export_rust_env} DESTDIR=%{buildroot} %{__python3} ./x.py install @@ -791,6 +812,9 @@ done # These are transient files used by x.py dist and install rm -rf ./build/dist/ ./build/tmp/ +# Some of the components duplicate-install binaries, leaving backups we don't want +rm -f %{buildroot}%{_bindir}/*.old + # Make sure the shared libraries are in the proper libdir %if "%{_libdir}" != "%{common_libdir}" mkdir -p %{buildroot}%{_libdir} @@ -857,13 +881,16 @@ rm -f %{buildroot}%{rustlibdir}/etc/lldb_* # We don't want Rust copies of LLVM tools (rust-lld, rust-llvm-dwp) rm -f %{buildroot}%{rustlibdir}/%{rust_triple}/bin/rust-ll* -%if 0%{?rhel} && 0%{?rhel} >= 8 +%if 0%{?rhel} # This allows users to build packages using Rust Toolset. %{__install} -D -m 644 %{S:100} %{buildroot}%{rpmmacrodir}/macros.rust-toolset %endif %check +%if 0%{?rhel} && 0%{?rhel} <= 9 +%{?set_build_flags} +%endif %{export_rust_env} # Sanity-check the installed binaries, debuginfo-stripped and all. @@ -881,7 +908,10 @@ done # The results are not stable on koji, so mask errors and just log it. # Some of the larger test artifacts are manually cleaned to save space. -%{__python3} ./x.py test --no-fail-fast || : + +# Bootstrap is excluded because it's not something we ship, and a lot of its +# tests are geared toward the upstream CI environment. +%{__python3} ./x.py test --no-fail-fast --exclude src/bootstrap || : rm -rf "./build/%{rust_triple}/test/" %{__python3} ./x.py test --no-fail-fast cargo || : @@ -995,16 +1025,7 @@ end} %files doc %docdir %{_docdir}/%{name} %dir %{_docdir}/%{name} -%dir %{_docdir}/%{name}/html -%{_docdir}/%{name}/html/*/ -%{_docdir}/%{name}/html/*.html -%{_docdir}/%{name}/html/*.css -%{_docdir}/%{name}/html/*.js -%{_docdir}/%{name}/html/*.png -%{_docdir}/%{name}/html/*.svg -%{_docdir}/%{name}/html/*.woff2 -%license %{_docdir}/%{name}/html/*.txt -%license %{_docdir}/%{name}/html/*.md +%{_docdir}/%{name}/html # former cargo-doc %docdir %{_docdir}/cargo %dir %{_docdir}/cargo @@ -1049,20 +1070,36 @@ end} %{rustlibdir}/src -%files analysis -%{rustlibdir}/%{rust_triple}/analysis/ - - -%if 0%{?rhel} && 0%{?rhel} >= 8 +%if 0%{?rhel} %files toolset %{rpmmacrodir}/macros.rust-toolset %endif %changelog -* Mon Aug 07 2023 Josh Stone - 1.66.1-2 -- CVE-2023-38497: fix cargo to respect umask -- Resolves: rhbz#2228140 +* Tue Aug 08 2023 Josh Stone - 1.71.1-1 +- Update to 1.71.1. +- Security fix for CVE-2023-38497 + +* Wed Jul 26 2023 Josh Stone - 1.71.0-2 +- Relax the suspicious_double_ref_op lint (rhbz2225471) +- Enable the profiler runtime for native hosts (rhbz2213875) + +* Thu Jul 20 2023 Josh Stone - 1.71.0-1 +- Update to 1.71.0. + +* Tue Jul 18 2023 Josh Stone - 1.70.0-1 +- Update to 1.70.0. + +* Wed May 10 2023 Josh Stone - 1.69.0-1 +- Update to 1.69.0. +- Obsolete rust-analysis. + +* Tue May 09 2023 Josh Stone - 1.68.2-1 +- Update to 1.68.2. + +* Mon May 08 2023 Josh Stone - 1.67.1-1 +- Update to 1.67.1. * Wed Jan 11 2023 Josh Stone - 1.66.1-1 - Update to 1.66.1.