From 4758050b2d5caeb61fa9536bfb1a738d6f35cc86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Sun, 28 Jun 2020 09:57:13 +0200 Subject: text: simplify remapping of original file content Use mmap with MAP_FIXED which replaces existing mappings without any race conditions between the munmap/mmap calls. --- text.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/text.c b/text.c index e6edf90..5ab53b3 100644 --- a/text.c +++ b/text.c @@ -960,21 +960,13 @@ static bool text_save_begin_inplace(TextSave *ctx) { ssize_t written = write_all(newfd, block->data, size); if (written == -1 || (size_t)written != size) goto err; - if (munmap(block->data, size) == -1) - goto err; - - void *data = mmap(block->data, size, PROT_READ, MAP_SHARED, newfd, 0); + void *data = mmap(block->data, size, PROT_READ, MAP_SHARED|MAP_FIXED, newfd, 0); if (data == MAP_FAILED) goto err; - if (data != block->data) { - munmap(data, size); - goto err; - } bool close_failed = (close(newfd) == -1); newfd = -1; if (close_failed) goto err; - block->data = data; block->type = MMAP; } /* overwrite the existing file content, if something goes wrong -- cgit v1.2.3