diff options
| author | bors <bors@rust-lang.org> | 2023-09-21 02:50:54 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2023-09-21 02:50:54 +0000 |
| commit | 4fda889bf8735755573b27e6116ce025f3ded5f9 (patch) | |
| tree | 320dfacc8bd8990b5a8e046f48a7cf6131ec11ff /compiler/rustc_span/src/source_map/tests.rs | |
| parent | cbce15c6173cd0fcd4abe25c108067d32f1135b4 (diff) | |
| parent | 5f33647fb392c2d4f71af94a223bc1a9abb80643 (diff) | |
| download | rust-4fda889bf8735755573b27e6116ce025f3ded5f9.tar.gz rust-4fda889bf8735755573b27e6116ce025f3ded5f9.zip | |
Auto merge of #115549 - saethlin:include-bytes-resilient, r=jackh726
Fall back to the unoptimized implementation in read_binary_file if File::metadata lies Fixes https://github.com/rust-lang/rust/issues/115458 r? `@jackh726` because you approved the previous PR
Diffstat (limited to 'compiler/rustc_span/src/source_map/tests.rs')
| -rw-r--r-- | compiler/rustc_span/src/source_map/tests.rs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/compiler/rustc_span/src/source_map/tests.rs b/compiler/rustc_span/src/source_map/tests.rs index e393db02064..a12f50c87a2 100644 --- a/compiler/rustc_span/src/source_map/tests.rs +++ b/compiler/rustc_span/src/source_map/tests.rs @@ -567,3 +567,30 @@ fn test_next_point() { assert_eq!(span.hi().0, 6); assert!(sm.span_to_snippet(span).is_err()); } + +#[cfg(target_os = "linux")] +#[test] +fn read_binary_file_handles_lying_stat() { + // read_binary_file tries to read the contents of a file into an Lrc<[u8]> while + // never having two copies of the data in memory at once. This is an optimization + // to support include_bytes! with large files. But since Rust allocators are + // sensitive to alignment, our implementation can't be bootstrapped off calling + // std::fs::read. So we test that we have the same behavior even on files where + // fs::metadata lies. + + // stat always says that /proc/self/cmdline is length 0, but it isn't. + let cmdline = Path::new("/proc/self/cmdline"); + let len = std::fs::metadata(cmdline).unwrap().len() as usize; + let real = std::fs::read(cmdline).unwrap(); + assert!(len < real.len()); + let bin = RealFileLoader.read_binary_file(cmdline).unwrap(); + assert_eq!(&real[..], &bin[..]); + + // stat always says that /sys/devices/system/cpu/kernel_max is the size of a block. + let kernel_max = Path::new("/sys/devices/system/cpu/kernel_max"); + let len = std::fs::metadata(kernel_max).unwrap().len() as usize; + let real = std::fs::read(kernel_max).unwrap(); + assert!(len > real.len()); + let bin = RealFileLoader.read_binary_file(kernel_max).unwrap(); + assert_eq!(&real[..], &bin[..]); +} |
