@@ -263,16 +263,33 @@ static umf_result_t file_mmap_aligned(file_memory_provider_t *file_provider,
263
263
return UMF_RESULT_ERROR_INVALID_ARGUMENT ; // arithmetic overflow
264
264
}
265
265
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 )) {
268
280
LOG_ERR ("cannot grow the file size from %zu to %zu" , size_fd ,
269
- offset_fd + extended_size );
281
+ aligned_offset_fd + extended_size );
270
282
return UMF_RESULT_ERROR_UNKNOWN ;
271
283
}
272
284
273
285
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 ;
276
293
}
277
294
278
295
ASSERT_IS_ALIGNED (extended_size , page_size );
@@ -344,7 +361,7 @@ static umf_result_t file_alloc_aligned(file_memory_provider_t *file_provider,
344
361
}
345
362
346
363
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 ;
348
365
* alloc_offset_fd =
349
366
file_provider -> offset_fd + new_offset_mmap - old_offset_mmap ;
350
367
file_provider -> offset_fd = * alloc_offset_fd + size ;
0 commit comments