From 7eca0d08630e01f58fb2e5928442b0bdd0146777 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Mon, 18 Apr 2016 15:49:56 +0200 Subject: text: when saving also fsync(2) the destination directory after rename(2) --- text.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/text.c b/text.c index 9358c9a..ef561d5 100644 --- a/text.c +++ b/text.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -893,7 +894,7 @@ static bool text_save_commit_atomic(TextSave *ctx) { if (fstat(ctx->fd, &meta) == -1) return false; - bool close_failed = close(ctx->fd) == -1; + bool close_failed = (close(ctx->fd) == -1); ctx->fd = -1; if (close_failed) return false; @@ -901,6 +902,21 @@ static bool text_save_commit_atomic(TextSave *ctx) { if (rename(ctx->tmpname, ctx->filename) == -1) return false; + free(ctx->tmpname); + ctx->tmpname = NULL; + + int dir = open(dirname(ctx->filename), O_DIRECTORY|O_RDONLY); + if (dir == -1) + return false; + + if (fsync(dir) == -1) { + close(dir); + return false; + } + + if (close(dir) == -1) + return false; + if (meta.st_mtime) ctx->txt->info = meta; return true; -- cgit v1.2.3