Skip to content

Commit ad49271

Browse files
committed
Fix updating offset_mmap in file_alloc_aligned()
Fixes: #796 Signed-off-by: Lukasz Dorau <lukasz.dorau@intel.com>
1 parent dc8dcf8 commit ad49271

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

src/provider/provider_file_memory.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)