@@ -47,6 +47,7 @@ mod imp {
47
47
use libc:: { sigaltstack, SIGSTKSZ , SS_DISABLE } ;
48
48
use libc:: { MAP_ANON , MAP_PRIVATE , PROT_NONE , PROT_READ , PROT_WRITE , SIGSEGV } ;
49
49
50
+ use crate :: sys:: unix:: os:: page_size;
50
51
use crate :: sys_common:: thread_info;
51
52
52
53
#[ cfg( any( target_os = "linux" , target_os = "android" ) ) ]
@@ -137,17 +138,16 @@ mod imp {
137
138
}
138
139
139
140
unsafe fn get_stackp ( ) -> * mut libc:: c_void {
140
- let page_size = crate :: sys:: unix:: os:: page_size ( ) ;
141
141
let stackp =
142
- mmap ( ptr:: null_mut ( ) , SIGSTKSZ + page_size, PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANON , -1 , 0 ) ;
142
+ mmap ( ptr:: null_mut ( ) , SIGSTKSZ + page_size ( ) , PROT_READ | PROT_WRITE , MAP_PRIVATE | MAP_ANON , -1 , 0 ) ;
143
143
if stackp == MAP_FAILED {
144
144
panic ! ( "failed to allocate an alternative stack" ) ;
145
145
}
146
- let guard_result = libc:: mprotect ( stackp, page_size, PROT_NONE ) ;
146
+ let guard_result = libc:: mprotect ( stackp, page_size ( ) , PROT_NONE ) ;
147
147
if guard_result != 0 {
148
148
panic ! ( "failed to set up alternative stack guard page" ) ;
149
149
}
150
- stackp
150
+ stackp. add ( page_size ( ) )
151
151
}
152
152
153
153
#[ cfg( any(
@@ -195,7 +195,9 @@ mod imp {
195
195
ss_size : SIGSTKSZ ,
196
196
} ;
197
197
sigaltstack ( & stack, ptr:: null_mut ( ) ) ;
198
- munmap ( handler. _data , SIGSTKSZ ) ;
198
+ // We know from `get_stackp` that the alternate stack we installed is part of a mapping
199
+ // that started one page earlier, so walk back a page and unmap from there.
200
+ munmap ( handler. _data . sub ( page_size ( ) ) , SIGSTKSZ + page_size ( ) ) ;
199
201
}
200
202
}
201
203
}
0 commit comments