@@ -982,7 +982,7 @@ gboolean
982
982
mono_pe_file_time_date_stamp (const gunichar2 * filename , guint32 * out )
983
983
{
984
984
void * map_handle ;
985
- gint32 map_size ;
985
+ guint32 map_size ;
986
986
gpointer file_map = mono_pe_file_map (filename , & map_size , & map_handle );
987
987
if (!file_map )
988
988
return FALSE;
@@ -1011,13 +1011,13 @@ mono_pe_file_time_date_stamp (const gunichar2 *filename, guint32 *out)
1011
1011
}
1012
1012
1013
1013
gpointer
1014
- mono_pe_file_map (const gunichar2 * filename , gint32 * map_size , void * * handle )
1014
+ mono_pe_file_map (const gunichar2 * filename , guint32 * map_size , void * * handle )
1015
1015
{
1016
1016
gchar * filename_ext = NULL ;
1017
1017
gchar * located_filename = NULL ;
1018
- int fd = -1 ;
1019
- struct stat statbuf ;
1018
+ guint64 fsize = 0 ;
1020
1019
gpointer file_map = NULL ;
1020
+ MonoFileMap * filed = NULL ;
1021
1021
ERROR_DECL (error );
1022
1022
1023
1023
/* According to the MSDN docs, a search path is applied to
@@ -1041,8 +1041,7 @@ mono_pe_file_map (const gunichar2 *filename, gint32 *map_size, void **handle)
1041
1041
goto exit ;
1042
1042
}
1043
1043
1044
- fd = open (filename_ext , O_RDONLY , 0 );
1045
- if (fd == -1 && (errno == ENOENT || errno == ENOTDIR ) && IS_PORTABILITY_SET ) {
1044
+ if ((filed = mono_file_map_open (filename_ext )) == NULL && IS_PORTABILITY_SET ) {
1046
1045
gint saved_errno = errno ;
1047
1046
1048
1047
located_filename = mono_portability_find_file (filename_ext , TRUE);
@@ -1053,38 +1052,39 @@ mono_pe_file_map (const gunichar2 *filename, gint32 *map_size, void **handle)
1053
1052
goto exit ;
1054
1053
}
1055
1054
1056
- fd = open (located_filename , O_RDONLY , 0 );
1057
- if (fd == -1 ) {
1058
- mono_trace (G_LOG_LEVEL_DEBUG , MONO_TRACE_IO_LAYER_PROCESS , "%s: Error opening file %s (3): %s" , __func__ , filename_ext , strerror (errno ));
1055
+ if ((filed = mono_file_map_open (located_filename )) == NULL ) {
1056
+ mono_trace (G_LOG_LEVEL_DEBUG , MONO_TRACE_IO_LAYER_PROCESS , "%s: Error opening file %s (3): %s" , __func__ , located_filename , strerror (errno ));
1059
1057
goto exit ;
1060
1058
}
1061
1059
}
1062
- else if (fd == -1 ) {
1060
+ else if (filed == NULL ) {
1063
1061
mono_trace (G_LOG_LEVEL_DEBUG , MONO_TRACE_IO_LAYER_PROCESS , "%s: Error opening file %s (3): %s" , __func__ , filename_ext , strerror (errno ));
1064
1062
goto exit ;
1065
1063
}
1066
1064
1067
- if (fstat (fd , & statbuf ) == -1 ) {
1065
+ fsize = mono_file_map_size (filed );
1066
+ if (fsize == 0 ) {
1068
1067
mono_trace (G_LOG_LEVEL_DEBUG , MONO_TRACE_IO_LAYER_PROCESS , "%s: Error stat()ing file %s: %s" , __func__ , filename_ext , strerror (errno ));
1069
1068
goto exit ;
1070
1069
}
1071
- * map_size = statbuf .st_size ;
1070
+ g_assert (fsize <= G_MAXUINT32 );
1071
+ * map_size = fsize ;
1072
1072
1073
1073
/* Check basic file size */
1074
- if (statbuf . st_size < sizeof (IMAGE_DOS_HEADER )) {
1075
- mono_trace (G_LOG_LEVEL_DEBUG , MONO_TRACE_IO_LAYER_PROCESS , "%s: File %s is too small: %" PRId64 , __func__ , filename_ext , ( gint64 ) statbuf . st_size );
1074
+ if (fsize < sizeof (IMAGE_DOS_HEADER )) {
1075
+ mono_trace (G_LOG_LEVEL_DEBUG , MONO_TRACE_IO_LAYER_PROCESS , "%s: File %s is too small: %" PRId64 , __func__ , filename_ext , fsize );
1076
1076
1077
1077
goto exit ;
1078
1078
}
1079
1079
1080
- file_map = mono_file_map (statbuf . st_size , MONO_MMAP_READ | MONO_MMAP_PRIVATE , fd , 0 , handle );
1080
+ file_map = mono_file_map (fsize , MONO_MMAP_READ | MONO_MMAP_PRIVATE , mono_file_map_fd ( filed ) , 0 , handle );
1081
1081
if (file_map == NULL ) {
1082
1082
mono_trace (G_LOG_LEVEL_DEBUG , MONO_TRACE_IO_LAYER_PROCESS , "%s: Error mmap()int file %s: %s" , __func__ , filename_ext , strerror (errno ));
1083
1083
goto exit ;
1084
1084
}
1085
1085
exit :
1086
- if (fd != -1 )
1087
- close ( fd );
1086
+ if (filed )
1087
+ mono_file_map_close ( filed );
1088
1088
g_free (located_filename );
1089
1089
g_free (filename_ext );
1090
1090
return file_map ;
0 commit comments