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