#include <sys/stat.h>
bool
-Unify_unify(char const *src, struct stat const *src_stat,
+Unify_unify(char const *src, struct stat const UNUSED *src_stat,
char const *dst)
{
size_t l = strlen(dst);
bool res = false;
// at first, set the ILI flags on 'src'
- if (vc_set_iattr_compat(src, src_stat->st_dev, src_stat->st_ino,
- 0, VC_IATTR_IUNLINK, VC_IATTR_IUNLINK,
- &src_stat->st_mode)==-1)
+ if (vc_set_iattr(src,
+ 0,
+ VC_IATTR_IUNLINK|VC_IATTR_IMMUTABLE,
+ VC_IATTR_IUNLINK|VC_IATTR_IMMUTABLE)==-1)
return false;
// now, create a temporary filename
}
// and rename the old file to this name
+
+ // NOTE: this rename() is race-free; when an attacker makes 'tmpfile' a
+ // directory, the operation would fail; when making it a symlink to a file
+ // or directory, the symlink but not the file/directory would be overridden
if (rename(dst, tmpfile)==-1) {
perror("rename()");
goto err;