@@ -2,6 +2,7 @@ use std::io::Read;
22
33use byteorder:: { ByteOrder , ReadBytesExt } ;
44
5+ use super :: error:: Error ;
56use super :: features:: FeatureSet ;
67use super :: section:: PerfFileSection ;
78
@@ -28,7 +29,7 @@ pub struct PerfHeader {
2829}
2930
3031impl PerfHeader {
31- pub fn parse < R : Read > ( mut reader : R ) -> Result < Self , std :: io :: Error > {
32+ pub fn parse < R : Read > ( mut reader : R ) -> Result < Self , Error > {
3233 let mut magic = [ 0 ; 8 ] ;
3334 reader. read_exact ( & mut magic) ?;
3435
@@ -39,11 +40,14 @@ impl PerfHeader {
3940 }
4041 }
4142
42- fn parse_impl < R : Read , T : ByteOrder > (
43- mut reader : R ,
44- magic : [ u8 ; 8 ] ,
45- ) -> Result < Self , std:: io:: Error > {
43+ fn parse_impl < R : Read , T : ByteOrder > ( mut reader : R , magic : [ u8 ; 8 ] ) -> Result < Self , Error > {
4644 let header_size = reader. read_u64 :: < T > ( ) ?;
45+
46+ // Detect if this is actually a pipe format instead of file format.
47+ if header_size == std:: mem:: size_of :: < PerfPipeHeader > ( ) as u64 {
48+ return Err ( Error :: PipeFormatDetectedInFileMode ) ;
49+ }
50+
4751 let attr_size = reader. read_u64 :: < T > ( ) ?;
4852 let attr_section = PerfFileSection :: parse :: < _ , T > ( & mut reader) ?;
4953 let data_section = PerfFileSection :: parse :: < _ , T > ( & mut reader) ?;
@@ -81,7 +85,7 @@ pub struct PerfPipeHeader {
8185}
8286
8387impl PerfPipeHeader {
84- pub fn parse < R : Read > ( mut reader : R ) -> Result < Self , std :: io :: Error > {
88+ pub fn parse < R : Read > ( mut reader : R ) -> Result < Self , Error > {
8589 let mut magic = [ 0 ; 8 ] ;
8690 reader. read_exact ( & mut magic) ?;
8791
@@ -90,6 +94,14 @@ impl PerfPipeHeader {
9094 } else {
9195 reader. read_u64 :: < byteorder:: BigEndian > ( ) ?
9296 } ;
97+
98+ // Detect if this is actually a file format instead of pipe format.
99+ if size > std:: mem:: size_of :: < Self > ( ) as u64
100+ && size == std:: mem:: size_of :: < PerfHeader > ( ) as u64
101+ {
102+ return Err ( Error :: FileFormatDetectedInPipeMode ) ;
103+ }
104+
93105 Ok ( Self { magic, size } )
94106 }
95107}
0 commit comments