@@ -23,13 +23,15 @@ mod mmap {
23
23
} ;
24
24
use crossbeam_utils:: atomic:: AtomicCell ;
25
25
use memmap2:: { Advice , Mmap , MmapMut , MmapOptions } ;
26
+ #[ cfg( unix) ]
27
+ use nix:: sys:: stat:: fstat;
26
28
use nix:: unistd;
27
29
use num_traits:: Signed ;
28
30
use std:: fs:: File ;
29
- use std:: io:: Write ;
31
+ use std:: io:: { self , Write } ;
30
32
use std:: ops:: { Deref , DerefMut } ;
31
33
#[ cfg( unix) ]
32
- use std:: os:: unix:: io:: { FromRawFd , IntoRawFd , RawFd } ;
34
+ use std:: os:: unix:: io:: { FromRawFd , RawFd } ;
33
35
34
36
fn advice_try_from_i32 ( vm : & VirtualMachine , i : i32 ) -> PyResult < Advice > {
35
37
Ok ( match i {
@@ -299,7 +301,7 @@ mod mmap {
299
301
fn py_new (
300
302
cls : PyTypeRef ,
301
303
MmapNewArgs {
302
- fileno : mut fd,
304
+ fileno : fd,
303
305
length,
304
306
flags,
305
307
prot,
@@ -348,12 +350,10 @@ mod mmap {
348
350
} ;
349
351
350
352
if fd != -1 {
351
- let file = unsafe { File :: from_raw_fd ( fd) } ;
352
- let metadata = file. metadata ( ) . map_err ( |err| err. to_pyexception ( vm) ) ?;
353
- let file_len: libc:: off_t = metadata. len ( ) . try_into ( ) . expect ( "file size overflow" ) ;
354
- // File::from_raw_fd will consume the fd, so we
355
- // have to get it again.
356
- fd = file. into_raw_fd ( ) ;
353
+ let metadata = fstat ( fd)
354
+ . map_err ( |err| io:: Error :: from_raw_os_error ( err as i32 ) . to_pyexception ( vm) ) ?;
355
+ let file_len = metadata. st_size ;
356
+
357
357
if map_size == 0 {
358
358
if file_len == 0 {
359
359
return Err ( vm. new_value_error ( "cannot mmap an empty file" . to_owned ( ) ) ) ;
0 commit comments