@@ -36,16 +36,14 @@ impl MachineAlloc {
36
36
}
37
37
38
38
/// SAFETY: There must be no existing `MiriAllocBytes`
39
- #[ allow( clippy:: cast_sign_loss) ]
40
- #[ allow( clippy:: cast_possible_truncation) ]
41
39
pub unsafe fn enable ( ) {
42
40
let mut alloc = ALLOCATOR . lock ( ) . unwrap ( ) ;
43
41
alloc. enabled = true ;
44
42
// This needs to specifically be the system pagesize!
45
43
alloc. page_size = unsafe {
46
44
let ret = libc:: sysconf ( libc:: _SC_PAGE_SIZE) ;
47
45
if ret > 0 {
48
- ret as _
46
+ ret. try_into ( ) . unwrap ( )
49
47
} else {
50
48
4096 // fallback
51
49
}
@@ -107,7 +105,6 @@ impl MachineAlloc {
107
105
}
108
106
109
107
/// SAFETY: See alloc::alloc()
110
- #[ allow( clippy:: cast_possible_wrap) ]
111
108
unsafe fn alloc_inner ( & mut self , layout : Layout ) -> * mut u8 {
112
109
let ( size, align) = MachineAlloc :: normalized_layout ( layout) ;
113
110
@@ -122,11 +119,11 @@ impl MachineAlloc {
122
119
if pinfo[ idx / 8 ..idx / 8 + size / 8 ] . iter ( ) . all ( |v| * v == 0 ) {
123
120
pinfo[ idx / 8 ..idx / 8 + size / 8 ] . fill ( 255 ) ;
124
121
unsafe {
125
- let ret = page. offset ( idx as isize ) ;
122
+ let ret = page. offset ( idx. try_into ( ) . unwrap ( ) ) ;
126
123
if ret. addr ( ) >= page. addr ( ) + self . page_size {
127
124
panic ! ( "Returing {} from page {}" , ret. addr( ) , page. addr( ) ) ;
128
125
}
129
- return page. offset ( idx as isize ) ;
126
+ return page. offset ( idx. try_into ( ) . unwrap ( ) ) ;
130
127
}
131
128
}
132
129
}
@@ -225,45 +222,47 @@ impl MachineAlloc {
225
222
///
226
223
/// SAFETY: Accessing memory after this point will result in a segfault
227
224
/// unless it is first unprotected.
228
- pub unsafe fn prepare_ffi ( ) -> Option < ( ) > {
225
+ pub unsafe fn prepare_ffi ( ) -> Result < ( ) , nix :: errno :: Errno > {
229
226
let mut alloc = ALLOCATOR . lock ( ) . unwrap ( ) ;
230
227
unsafe {
231
- alloc. mprotect ( ProtFlags :: PROT_NONE ) . unwrap ( ) ;
228
+ alloc. mprotect ( ProtFlags :: PROT_NONE ) ? ;
232
229
}
233
230
alloc. ffi_mode = true ;
234
- Some ( ( ) )
231
+ Ok ( ( ) )
235
232
}
236
233
237
- /// Deprotects all owned memory by setting it to RW.
238
- pub fn unprep_ffi ( ) -> Option < ( ) > {
234
+ /// Deprotects all owned memory by setting it to RW. Erroring here is very
235
+ /// likely unrecoverable, so it may panic if applying those permissions
236
+ /// fails.
237
+ pub fn unprep_ffi ( ) {
239
238
let mut alloc = ALLOCATOR . lock ( ) . unwrap ( ) ;
240
239
let default_flags = ProtFlags :: PROT_READ | ProtFlags :: PROT_WRITE ;
241
240
unsafe {
242
- alloc. mprotect ( default_flags) ? ;
241
+ alloc. mprotect ( default_flags) . unwrap ( ) ;
243
242
}
244
243
alloc. ffi_mode = false ;
245
- Some ( ( ) )
246
244
}
247
245
248
246
/// Applies `prot` to every page managed by the allocator.
249
247
///
250
248
/// SAFETY: Accessing memory in violation of the protection flags will
251
249
/// trigger a segfault.
252
- unsafe fn mprotect ( & mut self , prot : ProtFlags ) -> Option < ( ) > {
250
+ unsafe fn mprotect ( & mut self , prot : ProtFlags ) -> Result < ( ) , nix :: errno :: Errno > {
253
251
for & pg in & self . pages {
254
252
unsafe {
253
+ // We already know only non-null ptrs are pushed to self.pages
255
254
let addr: std:: ptr:: NonNull < std:: ffi:: c_void > =
256
- std:: ptr:: NonNull :: new_unchecked ( pg as * mut _ ) ;
257
- nix:: sys:: mman:: mprotect ( addr, self . page_size , prot) . ok ( ) ?;
255
+ std:: ptr:: NonNull :: new_unchecked ( pg. cast ( ) ) ;
256
+ nix:: sys:: mman:: mprotect ( addr, self . page_size , prot) ?;
258
257
}
259
258
}
260
259
for & ( hpg, size) in & self . huge_allocs {
261
260
unsafe {
262
- let addr = std:: ptr:: NonNull :: new_unchecked ( hpg as * mut _ ) ;
263
- nix:: sys:: mman:: mprotect ( addr, size, prot) . ok ( ) ?;
261
+ let addr = std:: ptr:: NonNull :: new_unchecked ( hpg. cast ( ) ) ;
262
+ nix:: sys:: mman:: mprotect ( addr, size, prot) ?;
264
263
}
265
264
}
266
- Some ( ( ) )
265
+ Ok ( ( ) )
267
266
}
268
267
}
269
268
0 commit comments