diff options
| author | bors <bors@rust-lang.org> | 2014-12-17 14:33:12 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-12-17 14:33:12 +0000 |
| commit | 2c533efd090e709a682468813aff36c368fdcd9d (patch) | |
| tree | 954e295b998dd6e26ee5c3ecace6d31b4a94661f | |
| parent | 4e8ba4955c6a6510102973b2d7bdd8ae3d682c15 (diff) | |
| parent | 9a47d65e3b71a86abd6e64c8f126cff2d6e80f92 (diff) | |
| download | rust-2c533efd090e709a682468813aff36c368fdcd9d.tar.gz rust-2c533efd090e709a682468813aff36c368fdcd9d.zip | |
auto merge of #19799 : alexcrichton/rust/stop-panicking, r=huonw
Fix a panic where the compiler was looking at stale or old metadata. See #19798, #19772, #19757, #19744, #19718, #19691.
| -rw-r--r-- | src/librustc/metadata/cstore.rs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/librustc/metadata/cstore.rs b/src/librustc/metadata/cstore.rs index c0642f29abc..cede093fae6 100644 --- a/src/librustc/metadata/cstore.rs +++ b/src/librustc/metadata/cstore.rs @@ -238,13 +238,17 @@ impl MetadataBlob { MetadataArchive(ref ar) => ar.as_slice(), }; if slice.len() < 4 { - &[] + &[] // corrupt metadata } else { - let len = ((slice[0] as u32) << 24) | - ((slice[1] as u32) << 16) | - ((slice[2] as u32) << 8) | - ((slice[3] as u32) << 0); - slice.slice(4, len as uint + 4) + let len = (((slice[0] as u32) << 24) | + ((slice[1] as u32) << 16) | + ((slice[2] as u32) << 8) | + ((slice[3] as u32) << 0)) as uint; + if len + 4 <= slice.len() { + slice.slice(4, len + 4) + } else { + &[] // corrupt or old metadata + } } } } |
