diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-06-17 20:56:01 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-06-17 20:56:01 +0200 |
| commit | 6fe265315626be4f5c3116217dfebd4435fbc14e (patch) | |
| tree | 357994a3b563d23320b0ead83a5c1560ba042f60 /src/libsyntax_pos | |
| parent | 04d653902569b398e584692f45a2996f7437d5af (diff) | |
| parent | ccb2dfbfec812d1502626992a8856df27c4fa950 (diff) | |
| download | rust-6fe265315626be4f5c3116217dfebd4435fbc14e.tar.gz rust-6fe265315626be4f5c3116217dfebd4435fbc14e.zip | |
Rollup merge of #61908 - matklad:overflow, r=petrochenkov
don't ICE on large files This is an extremely marginal error, so the cost of properly threading `Handler` everywhere just not seemed justified. However, it's useful to panic when we create a file, and not when we slice strings with overflown indexes somewhere in the guts of the compiler. For this reason, while we provide safe `try_new_source_file`, we don't change the existing public interface and just panic more or less cleanly. closes #61904 r? @petrochenkov
Diffstat (limited to 'src/libsyntax_pos')
| -rw-r--r-- | src/libsyntax_pos/lib.rs | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/libsyntax_pos/lib.rs b/src/libsyntax_pos/lib.rs index e7158372762..2dd409bf5be 100644 --- a/src/libsyntax_pos/lib.rs +++ b/src/libsyntax_pos/lib.rs @@ -859,6 +859,9 @@ impl ExternalSource { } } +#[derive(Debug)] +pub struct OffsetOverflowError; + /// A single source in the `SourceMap`. #[derive(Clone)] pub struct SourceFile { @@ -1040,7 +1043,7 @@ impl SourceFile { name_was_remapped: bool, unmapped_path: FileName, mut src: String, - start_pos: BytePos) -> SourceFile { + start_pos: BytePos) -> Result<SourceFile, OffsetOverflowError> { remove_bom(&mut src); let src_hash = { @@ -1054,11 +1057,14 @@ impl SourceFile { hasher.finish() }; let end_pos = start_pos.to_usize() + src.len(); + if end_pos > u32::max_value() as usize { + return Err(OffsetOverflowError); + } let (lines, multibyte_chars, non_narrow_chars) = analyze_source_file::analyze_source_file(&src[..], start_pos); - SourceFile { + Ok(SourceFile { name, name_was_remapped, unmapped_path: Some(unmapped_path), @@ -1072,7 +1078,7 @@ impl SourceFile { multibyte_chars, non_narrow_chars, name_hash, - } + }) } /// Returns the `BytePos` of the beginning of the current line. |
