From: Jo-Philipp Wich Date: Thu, 31 Mar 2016 00:06:12 +0000 (+0200) Subject: file: write through symlinks on uci commit X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fuci.git;a=commitdiff_plain;h=ec96e1f93d6d0faa3f3c40f6bcbc0006550281a8 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 --- 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)