Skip to content

Regression in File::read_to_end on 1.57.0 Nightly #90263

Closed
@noproto

Description

@noproto

PR #89582 (commit 910692d) created a regression in File::read_to_end on the Rust Nightly channel (1.57.0 Nightly). This is before main(), it impacts cdylib projects.

Code

lib.rs

use std::io::prelude::*;

// init_rtld_audit_interface
#[used]
#[allow(non_upper_case_globals)]
#[link_section = ".init_array"]
static init_rtld_audit_interface: unsafe extern "C" fn(i32, *const *const i8, *const *const i8) = {
    #[link_section = ".text.startup"]
    unsafe extern "C" fn init_rtld_audit_interface(_argc: i32, _argv: *const *const i8, _envp: *const *const i8) { read_proc_environ(); }
    init_rtld_audit_interface
};

// la_version
#[no_mangle]
unsafe extern "C" fn la_version(version: u32) -> u32 { version }

fn read_proc_environ() {
    let mut environ = std::fs::File::open("/proc/self/environ").expect("Lost track of environment");
    let mut environ_contents: Vec<u8> = vec![];
    environ.read_to_end(&mut environ_contents).expect("Unexpected null reference");
}

Cargo.toml

# General info
[package]
name = "readenv"
version = "0.1.0"
edition = "2021"

# Build targets
[lib]
name = "readenv"
path = "lib.rs"
crate-type = ["cdylib"]

Makefile

test:
	@echo "Rust nightly-10-09"
	cargo +nightly-2021-10-09 build --lib --release;LD_AUDIT=${PWD}/target/release/libreadenv.so /usr/bin/test || true
	@echo "Rust nightly-10-10"
	cargo +nightly-2021-10-10 build --lib --release;LD_AUDIT=${PWD}/target/release/libreadenv.so /usr/bin/test || true

I expected to see this happen: (no output)

Rust nightly-10-09
cargo +nightly-2021-10-09 build --lib --release;LD_AUDIT=/home/user/readenv/target/release/libreadenv.so /usr/bin/test || true
   Compiling readenv v0.1.0 (/home/user/readenv)
    Finished release [optimized] target(s) in 0.55s
Rust nightly-10-10
cargo +nightly-2021-10-10 build --lib --release;LD_AUDIT=/home/user/readenv/target/release/libreadenv.so /usr/bin/test || true
   Compiling readenv v0.1.0 (/home/user/readenv)
    Finished release [optimized] target(s) in 0.44s

Instead, this happened: Segmentation fault

Rust nightly-10-09
cargo +nightly-2021-10-09 build --lib --release;LD_AUDIT=/home/user/readenv/target/release/libreadenv.so /usr/bin/test || true
   Compiling readenv v0.1.0 (/home/user/readenv)
    Finished release [optimized] target(s) in 0.55s
Rust nightly-10-10
cargo +nightly-2021-10-10 build --lib --release;LD_AUDIT=/home/user/readenv/target/release/libreadenv.so /usr/bin/test || true
   Compiling readenv v0.1.0 (/home/user/readenv)
    Finished release [optimized] target(s) in 0.44s
Segmentation fault

Version it worked on

It most recently worked on: Rust 1.57.0-nightly, nightly-2021-10-09-aarch64-unknown-linux-gnu

Version with regression

Regression occurred in: Rust 1.57.0-nightly, nightly-2021-10-10-aarch64-unknown-linux-gnu

rustc --version --verbose:

rustc 1.57.0-nightly (a8f2463c6 2021-10-09)
binary: rustc
commit-hash: a8f2463c68a6532d74a13ec402ec5b513e4e2726
commit-date: 2021-10-09
host: aarch64-unknown-linux-gnu
release: 1.57.0-nightly
LLVM version: 13.0.0

@rustbot modify labels: +regression-from-stable-to-nightly -regression-untriaged

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-ioArea: `std::io`, `std::fs`, `std::net` and `std::path`C-bugCategory: This is a bug.P-mediumMedium priorityT-libsRelevant to the library team, which will review and decide on the PR/issue.regression-from-stable-to-betaPerformance or correctness regression from stable to beta.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions