mirror of
https://chromium.googlesource.com/crosvm/crosvm
synced 2024-11-28 17:44:10 +00:00
b696d4feb2
There are no *at variants for the xattr syscalls so we were using the path-based variants by reading the /proc/self/fd symlink. While this symlink can track renames it cannot track if the user hard links the file to some other location and then unlinks the original location. In this case the symlink simply shows that the path was deleted even though the fd is still valid. To deal with this, stop using the path-based method. For regular files and directories, we can simply open them and then make the appropriate f{get,set,list,remove}xattr syscall. For non-regular files and directories we can emulate an *at syscall by changing the CWD to /proc and then making the path-based syscall via the self/fd path. Even though the symlink is no longer valid, manipulating the fd via this path still works. BUG=b:168689429 TEST=Create a file, set an xattr, hard link it to a new location, unlink the original, and then verify that {get,set}fattr still works on the new link Change-Id: Ic291f432b96f18e3e7ccbcf27737d5f8fd240a65 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2437684 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org> Reviewed-by: Stephen Barber <smbarber@chromium.org> Commit-Queue: Chirantan Ekbote <chirantan@chromium.org>
49 lines
No EOL
930 B
Text
49 lines
No EOL
930 B
Text
# Copyright 2019 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
@include /usr/share/policy/crosvm/common_device.policy
|
|
|
|
copy_file_range: 1
|
|
fallocate: 1
|
|
fchdir: 1
|
|
fchmod: 1
|
|
fchmodat: 1
|
|
fchown: 1
|
|
fchownat: 1
|
|
fdatasync: 1
|
|
fgetxattr: 1
|
|
getxattr: 1
|
|
fsetxattr: 1
|
|
setxattr: 1
|
|
flistxattr: 1
|
|
listxattr: 1
|
|
fremovexattr: 1
|
|
removexattr: 1
|
|
fstatfs: 1
|
|
fsync: 1
|
|
ftruncate: 1
|
|
getdents64: 1
|
|
getegid: 1
|
|
geteuid: 1
|
|
getrandom: 1
|
|
ioctl: arg1 == FS_IOC_GET_ENCRYPTION_POLICY || arg1 == FS_IOC_SET_ENCRYPTION_POLICY || arg1 == FS_IOC_FSGETXATTR || arg1 == FS_IOC_FSSETXATTR || arg1 == FS_IOC_GETFLAGS || arg1 == FS_IOC_SETFLAGS
|
|
linkat: 1
|
|
lseek: 1
|
|
mkdir: 1
|
|
mkdirat: 1
|
|
mknodat: 1
|
|
newfstatat: 1
|
|
open: return ENOENT
|
|
openat: 1
|
|
preadv: 1
|
|
pwritev: 1
|
|
readlinkat: 1
|
|
renameat2: 1
|
|
setresgid: 1
|
|
setresuid: 1
|
|
symlinkat: 1
|
|
statx: 1
|
|
umask: 1
|
|
unlinkat: 1
|
|
utimensat: 1 |