From ec96e1f93d6d0faa3f3c40f6bcbc0006550281a8 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Thu, 31 Mar 2016 02:06:12 +0200 Subject: [PATCH] file: write through symlinks on uci commit The rename() syscall operates on the destination path directly, therfore resolve the real path before doing the rename to not clobber the destination in case it is a symlink pointing to another file. Signed-off-by: Jo-Philipp Wich --- file.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/file.c b/file.c index 35755d8..7e1e4e6 100644 --- a/file.c +++ b/file.c @@ -800,9 +800,13 @@ done: free(name); free(path); uci_close_stream(f1); - if (do_rename && rename(filename, p->path)) { - unlink(filename); - UCI_THROW(ctx, UCI_ERR_IO); + if (do_rename) { + path = realpath(p->path, NULL); + if (!path || rename(filename, path)) { + unlink(filename); + UCI_THROW(ctx, UCI_ERR_IO); + } + free(path); } free(filename); if (ctx->err) -- 2.11.0