switchToWatchXid(): modified the new migrate-path to work when there exists a process...
[util-vserver.git] / util-vserver / lib_internal / unify-unify.c
index 5c78be6..a3d6a18 100644 (file)
@@ -40,7 +40,9 @@ Unify_unify(char const *src, struct stat const UNUSED *src_stat,
 
   // at first, set the ILI flags on 'src'
   if (vc_set_iattr(src,
-                  0, VC_IATTR_IUNLINK, VC_IATTR_IUNLINK)==-1)
+                  0,
+                  VC_IATTR_IUNLINK|VC_IATTR_IMMUTABLE,
+                  VC_IATTR_IUNLINK|VC_IATTR_IMMUTABLE)==-1)
     return false;
 
   // now, create a temporary filename
@@ -55,6 +57,10 @@ Unify_unify(char const *src, struct stat const UNUSED *src_stat,
   }
 
   // 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;