about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2014-12-17 14:33:12 +0000
committerbors <bors@rust-lang.org>2014-12-17 14:33:12 +0000
commit2c533efd090e709a682468813aff36c368fdcd9d (patch)
tree954e295b998dd6e26ee5c3ecace6d31b4a94661f
parent4e8ba4955c6a6510102973b2d7bdd8ae3d682c15 (diff)
parent9a47d65e3b71a86abd6e64c8f126cff2d6e80f92 (diff)
downloadrust-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.rs16
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
+            }
         }
     }
 }