diff options
| author | bors <bors@rust-lang.org> | 2024-11-24 07:37:32 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-11-24 07:37:32 +0000 |
| commit | ab3cf268b518f0312d86346db3bf79d5ec33b3b7 (patch) | |
| tree | dbe8b1dc18a1fdebc3bcc47ee4134ddb22261189 | |
| parent | 4e4c20d2abe6a218991152b735800fbaf51aedd6 (diff) | |
| parent | 5caf516cd087af9b6b8349e12709b2e77b054f39 (diff) | |
| download | rust-ab3cf268b518f0312d86346db3bf79d5ec33b3b7.tar.gz rust-ab3cf268b518f0312d86346db3bf79d5ec33b3b7.zip | |
Auto merge of #132791 - tyilo:big-file-fail-fast, r=compiler-errors
rustc: Fail fast when compiling a source file larger than 4 GiB Currently if you try to compile a file that is larger than 4 GiB, `rustc` will first read the whole into memory before failing. If we can read the metadata of the file, we can fail before reading the file.
| -rw-r--r-- | compiler/rustc_span/src/lib.rs | 5 | ||||
| -rw-r--r-- | compiler/rustc_span/src/source_map.rs | 11 |
2 files changed, 15 insertions, 1 deletions
diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs index 8966cfc9171..1481e1cbd91 100644 --- a/compiler/rustc_span/src/lib.rs +++ b/compiler/rustc_span/src/lib.rs @@ -1829,6 +1829,8 @@ impl StableSourceFileId { } impl SourceFile { + const MAX_FILE_SIZE: u32 = u32::MAX - 1; + pub fn new( name: FileName, mut src: String, @@ -1849,6 +1851,9 @@ impl SourceFile { let stable_id = StableSourceFileId::from_filename_in_current_crate(&name); let source_len = src.len(); let source_len = u32::try_from(source_len).map_err(|_| OffsetOverflowError)?; + if source_len > Self::MAX_FILE_SIZE { + return Err(OffsetOverflowError); + } let (lines, multibyte_chars) = analyze_source_file::analyze_source_file(&src); diff --git a/compiler/rustc_span/src/source_map.rs b/compiler/rustc_span/src/source_map.rs index e74a5c2d8fe..55e106b661b 100644 --- a/compiler/rustc_span/src/source_map.rs +++ b/compiler/rustc_span/src/source_map.rs @@ -115,6 +115,12 @@ impl FileLoader for RealFileLoader { } fn read_file(&self, path: &Path) -> io::Result<String> { + if path.metadata().is_ok_and(|metadata| metadata.len() > SourceFile::MAX_FILE_SIZE.into()) { + return Err(io::Error::other(format!( + "text files larger than {} bytes are unsupported", + SourceFile::MAX_FILE_SIZE + ))); + } fs::read_to_string(path) } @@ -297,7 +303,10 @@ impl SourceMap { /// unmodified. pub fn new_source_file(&self, filename: FileName, src: String) -> Lrc<SourceFile> { self.try_new_source_file(filename, src).unwrap_or_else(|OffsetOverflowError| { - eprintln!("fatal error: rustc does not support files larger than 4GB"); + eprintln!( + "fatal error: rustc does not support text files larger than {} bytes", + SourceFile::MAX_FILE_SIZE + ); crate::fatal_error::FatalError.raise() }) } |
