@@ -2,6 +2,7 @@ use super::cpu::Cpu;
22use super :: freqency:: Frequency ;
33use super :: filter:: AddrFilter ;
44use crate :: packet:: Unknown ;
5+ use crate :: error:: { PtError , PtErrorCode } ;
56
67use std:: mem;
78use std:: borrow:: Cow ;
@@ -22,8 +23,9 @@ mod test {
2223 use crate :: packet:: Unknown ;
2324
2425 #[ test]
26+ #[ should_panic]
2527 fn test_config_empty ( ) {
26- let c = ConfigBuilder :: new ( & mut [ 0 ; 0 ] ) . finish ( ) ;
28+ let c = ConfigBuilder :: new ( & mut [ 0 ; 0 ] ) . unwrap ( ) . finish ( ) ;
2729 assert_eq ! ( c. 0 . begin, c. 0 . end) ;
2830 assert_eq ! ( c. 0 . size, mem:: size_of:: <pt_config>( ) ) ;
2931 }
@@ -32,7 +34,7 @@ mod test {
3234 fn test_config_buf ( ) {
3335 let mut data = [ 0 ; 16 ] ;
3436 let len = data. len ( ) ;
35- let c = ConfigBuilder :: new ( & mut data) . finish ( ) ;
37+ let c = ConfigBuilder :: new ( & mut data) . unwrap ( ) . finish ( ) ;
3638 assert_eq ! ( c. 0 . end as usize - c. 0 . begin as usize , len) ;
3739 }
3840
@@ -42,6 +44,7 @@ mod test {
4244 let c = ConfigBuilder :: with_callback (
4345 & mut data, |c, p| {
4446 ( Unknown :: new ( c. 0 . cpu . model + p[ 0 ] ) , 1 ) } )
47+ . unwrap ( )
4548 . filter ( AddrFilterBuilder :: new ( )
4649 . addr0 ( AddrRange :: new ( 1 , 2 , AddrConfig :: STOP ) )
4750 . addr1 ( AddrRange :: new ( 3 , 4 , AddrConfig :: FILTER ) )
@@ -120,7 +123,9 @@ mod test {
120123 let mut cfg = ConfigBuilder :: with_callback(
121124 & mut kektop,
122125 |c, p, | { ( Unknown :: new( c. 0 . cpu. stepping + p[ 8 ] ) , 17 ) } )
123- . cpu( Cpu :: intel( 1 , 2 , 3 ) ) . finish( ) ;
126+ . unwrap( )
127+ . cpu( Cpu :: intel( 1 , 2 , 3 ) )
128+ . finish( ) ;
124129
125130 for _ in 0 ..10 { assert!( check_callback( & mut cfg, 13 , 17 ) ) }
126131 }
@@ -134,7 +139,7 @@ mod test {
134139 if let Cow :: Owned ( _) = c. 0 { panic ! ( "BUG!" ) }
135140 // assert_eq!(c.0.as_ref() as *const _, raw);
136141 ( Unknown :: new( p[ 100 ] ) , 17 )
137- } ) . cpu( Cpu :: intel( 1 , 2 , 3 ) ) . finish( ) ;
142+ } ) . unwrap ( ) . cpu( Cpu :: intel( 1 , 2 , 3 ) ) . finish( ) ;
138143
139144 unsafe {
140145 let mut ukn: pt_packet_unknown = std:: mem:: zeroed( ) ;
@@ -149,7 +154,7 @@ mod test {
149154 let mut x = [ 10 ; 10 ] ;
150155 let a : Config < ( ) > ;
151156 {
152- let mut c = ConfigBuilder :: new ( & mut x) ;
157+ let mut c = ConfigBuilder :: new( & mut x) . unwrap ( ) ;
153158 a = c. finish( ) ;
154159 c. cpu( Cpu :: intel( 1 , 2 , 3 ) ) ;
155160 let b = c. finish( ) ;
@@ -183,17 +188,22 @@ unsafe extern "C" fn decode_callback<'a, F, C>(ukn: *mut pt_packet_unknown,
183188/// A helper type to create the libipt Configuration instance
184189 pub struct ConfigBuilder < ' a , T > ( pt_config , PhantomData < & ' a mut T > ) ;
185190impl < ' a , T > ConfigBuilder < ' a , T > {
191+ // when theres a bug here, there might be on in `new` too.
186192 /// Initializes a Config instance with a buffer and decoder callback
187193 pub fn with_callback < F > ( buf : & ' a mut [ u8 ] , mut cb : F ) -> Result < Self , PtError >
188194 where F : FnMut ( & Config < T > , & [ u8 ] ) -> ( Unknown < T > , u32 ) ,
189195 F : ' a {
196+ // yeah.. libipt doesnt handle this -_-
197+ if buf. len ( ) < 1 { return Err (
198+ PtError :: new ( PtErrorCode :: Invalid , "buffer cant be empty!" )
199+ ) }
190200 let mut cfg: pt_config = unsafe { mem:: zeroed ( ) } ;
191201 cfg. size = mem:: size_of :: < pt_config > ( ) ;
192202 cfg. begin = buf. as_mut_ptr ( ) ;
193203 cfg. end = unsafe { buf. as_mut_ptr ( ) . offset ( buf. len ( ) as isize ) } ;
194204 cfg. decode . callback = Some ( decode_callback :: < F , T > ) ;
195205 cfg. decode . context = & mut cb as * mut _ as * mut c_void ;
196- ConfigBuilder :: < T > ( cfg, PhantomData )
206+ Ok ( ConfigBuilder :: < T > ( cfg, PhantomData ) )
197207 }
198208
199209 /// The cpu used for capturing the data.
@@ -238,12 +248,16 @@ impl<'a> ConfigBuilder<'a, ()> {
238248 /// Initializes a Config instance with only a buffer.
239249 /// If you want to use a decoder callback,
240250 /// use the `with_callback` function
241- pub fn new ( buf : & ' a mut [ u8 ] ) -> ConfigBuilder < ( ) > {
251+ /// returns `Invalid` when buf is empty
252+ pub fn new ( buf : & ' a mut [ u8 ] ) -> Result < ConfigBuilder < ( ) > , PtError > {
253+ if buf. len ( ) < 1 { return Err (
254+ PtError :: new ( PtErrorCode :: Invalid , "buffer cant be empty!" )
255+ ) }
242256 let mut cfg: pt_config = unsafe { mem:: zeroed ( ) } ;
243257 cfg. size = mem:: size_of :: < pt_config > ( ) ;
244258 cfg. begin = buf. as_mut_ptr ( ) ;
245259 cfg. end = unsafe { buf. as_mut_ptr ( ) . offset ( buf. len ( ) as isize ) } ;
246- ConfigBuilder :: < ( ) > ( cfg, PhantomData )
260+ Ok ( ConfigBuilder :: < ( ) > ( cfg, PhantomData ) )
247261 }
248262}
249263
0 commit comments