diff --git a/src/librustc/metadata/cstore.rs b/src/librustc/metadata/cstore.rs index bb1c75b075c2b..976adaad93a18 100644 --- a/src/librustc/metadata/cstore.rs +++ b/src/librustc/metadata/cstore.rs @@ -236,13 +236,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 + } } } }