@@ -101,11 +101,29 @@
oldbuf.st_ino = newbuf.st_ino;
}
}
- pseudo_debug(PDBGF_FILE, "creating new '%s' [%llu] to rename\n",
- oldpath, (unsigned long long) oldbuf.st_ino);
- pseudo_client_op(OP_LINK, 0, -1, -1, oldpath, &oldbuf);
+ if (pseudo_client_ignore_path(oldpath)) {
+ /* oldpath is ignored (not in INCLUDE_PATHS), so
+ * OP_LINK on it would be silently dropped and the
+ * subsequent OP_RENAME would be a no-op. Instead,
+ * create the entry directly at newpath.
+ * OP_LINK does not override uid/gid with pseudo_fuid/
+ * pseudo_fgid (unlike OP_CREAT), so set them explicitly
+ * to avoid recording the host user's real ids.
+ */
+ oldbuf.st_uid = pseudo_fuid;
+ oldbuf.st_gid = pseudo_fgid;
+ pseudo_debug(PDBGF_OP, "creating new '%s' [%llu] directly at newpath (oldpath ignored)\n",
+ newpath, (unsigned long long) oldbuf.st_ino);
+ pseudo_client_op(OP_LINK, 0, -1, -1, newpath, &oldbuf);
+ } else {
+ pseudo_debug(PDBGF_FILE, "creating new '%s' [%llu] to rename\n",
+ oldpath, (unsigned long long) oldbuf.st_ino);
+ pseudo_client_op(OP_LINK, 0, -1, -1, oldpath, &oldbuf);
+ pseudo_client_op(OP_RENAME, 0, -1, -1, newpath, &oldbuf, oldpath);
+ }
+ } else {
+ pseudo_client_op(OP_RENAME, 0, -1, -1, newpath, &oldbuf, oldpath);
}
- pseudo_client_op(OP_RENAME, 0, -1, -1, newpath, &oldbuf, oldpath);
errno = save_errno;
/* return rc;