Browse Source

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 <jo@mein.io>
Jo-Philipp Wich 8 years ago
parent
commit
ec96e1f93d
1 changed files with 7 additions and 3 deletions
  1. 7 3
      file.c

+ 7 - 3
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)