@@ -62,7 +62,7 @@ const JMP_MAX_SIZE: usize = 12;
62
62
#[ cfg( target_arch = "x86" ) ]
63
63
#[ inline]
64
64
fn assemble_jmp_to_address ( address : usize , mut relative : isize ) -> ( [ u8 ; JMP_MAX_SIZE ] , usize ) {
65
- use core:: { i16 , i8} ;
65
+ use core:: { i32 , i8} ;
66
66
if ( relative - 2 >= ( i8:: MIN as isize ) ) && ( relative - 2 <= ( i8:: MAX as isize ) ) {
67
67
relative -= 2 ;
68
68
(
@@ -78,20 +78,20 @@ fn assemble_jmp_to_address(address: usize, mut relative: isize) -> ([u8; JMP_MAX
78
78
] ,
79
79
2 ,
80
80
)
81
- } else if ( relative - 3 >= ( i16 :: MIN as isize ) ) && ( relative - 3 <= ( i16 :: MAX as isize ) ) {
81
+ } else if ( relative - 5 >= ( i32 :: MIN as isize ) ) && ( relative - 5 <= ( i32 :: MAX as isize ) ) {
82
82
relative -= 5 ;
83
83
(
84
84
[
85
- // jmp rel16
85
+ // jmp rel32
86
86
0xE9 ,
87
87
relative as u8 ,
88
88
( relative >> 8 ) as u8 ,
89
- 0 ,
90
- 0 ,
89
+ ( relative >> 16 ) as u8 ,
90
+ ( relative >> 24 ) as u8 ,
91
91
0 ,
92
92
0 ,
93
93
] ,
94
- 3 ,
94
+ 5 ,
95
95
)
96
96
} else {
97
97
(
@@ -294,16 +294,21 @@ mod tests {
294
294
assert_eq ! ( the_ultimate_question( ) , 42 ) ;
295
295
}
296
296
297
+ // Test smallest possible function (in debug mode)
298
+ // In 32-bit this should panic and properly detect we cannot patch a 1-byte function
297
299
#[ test]
300
+ #[ cfg_attr( target_arch = "x86" , should_panic) ]
298
301
fn test_tiny ( ) {
299
302
assert_eq ! ( tiny( ) , ( ) ) ;
300
303
301
- {
304
+ if let Err ( err ) = std :: panic :: catch_unwind ( || {
302
305
let _guard = patch0 ( tiny, || ( ) ) ;
303
306
304
307
assert_eq ! ( tiny( ) , ( ) ) ;
305
308
assert_eq ! ( the_ultimate_question( ) , 42 ) ;
306
309
assert_eq ! ( other_question( ) , 23 ) ;
310
+ } ) {
311
+ assert_eq ! ( err. downcast( ) . unwrap( ) , "target function is too small (1 byte) to patch" ) ;
307
312
}
308
313
309
314
assert_eq ! ( tiny( ) , ( ) ) ;
0 commit comments