@@ -263,16 +263,33 @@ static umf_result_t file_mmap_aligned(file_memory_provider_t *file_provider,
263263 return UMF_RESULT_ERROR_INVALID_ARGUMENT ; // arithmetic overflow
264264 }
265265
266- if (offset_fd + extended_size > size_fd ) {
267- if (utils_fallocate (fd , offset_fd , extended_size )) {
266+ // offset_fd has to be also page-aligned since it is the offset of mmap()
267+ size_t aligned_offset_fd = offset_fd ;
268+ rest = aligned_offset_fd & (page_size - 1 );
269+ if (rest ) {
270+ aligned_offset_fd += page_size - rest ;
271+ }
272+ if (aligned_offset_fd < offset_fd ) {
273+ LOG_ERR ("arithmetic overflow of file offset" );
274+ return UMF_RESULT_ERROR_INVALID_ARGUMENT ; // arithmetic overflow
275+ }
276+
277+ if (aligned_offset_fd + extended_size > size_fd ) {
278+ if (utils_fallocate (fd , offset_fd ,
279+ extended_size + aligned_offset_fd - offset_fd )) {
268280 LOG_ERR ("cannot grow the file size from %zu to %zu" , size_fd ,
269- offset_fd + extended_size );
281+ aligned_offset_fd + extended_size );
270282 return UMF_RESULT_ERROR_UNKNOWN ;
271283 }
272284
273285 LOG_DEBUG ("file size grown from %zu to %zu" , size_fd ,
274- offset_fd + extended_size );
275- file_provider -> size_fd = size_fd = offset_fd + extended_size ;
286+ aligned_offset_fd + extended_size );
287+ file_provider -> size_fd = size_fd = aligned_offset_fd + extended_size ;
288+ }
289+
290+ if (aligned_offset_fd > offset_fd ) {
291+ file_provider -> offset_fd = aligned_offset_fd ;
292+ offset_fd = aligned_offset_fd ;
276293 }
277294
278295 ASSERT_IS_ALIGNED (extended_size , page_size );
@@ -344,7 +361,7 @@ static umf_result_t file_alloc_aligned(file_memory_provider_t *file_provider,
344361 }
345362
346363 size_t old_offset_mmap = file_provider -> offset_mmap ;
347- file_provider -> offset_mmap = new_offset_mmap ;
364+ file_provider -> offset_mmap = new_offset_mmap + size ;
348365 * alloc_offset_fd =
349366 file_provider -> offset_fd + new_offset_mmap - old_offset_mmap ;
350367 file_provider -> offset_fd = * alloc_offset_fd + size ;
0 commit comments