diff --git a/pkg/sentry/syscalls/linux/sys_stat.go b/pkg/sentry/syscalls/linux/sys_stat.go index 4386debe6..1daf76b18 100644 --- a/pkg/sentry/syscalls/linux/sys_stat.go +++ b/pkg/sentry/syscalls/linux/sys_stat.go @@ -50,6 +50,9 @@ func Newfstatat(t *kernel.Task, sysno uintptr, args arch.SyscallArguments) (uint } func fstatat(t *kernel.Task, dirfd int32, pathAddr, statAddr hostarch.Addr, flags int32) error { + // TODO(b/270247637): gVisor does not yet support automount, so + // AT_NO_AUTOMOUNT flag is a no-op. + flags &= ^linux.AT_NO_AUTOMOUNT if flags&^(linux.AT_EMPTY_PATH|linux.AT_SYMLINK_NOFOLLOW) != 0 { return linuxerr.EINVAL } diff --git a/test/syscalls/linux/stat.cc b/test/syscalls/linux/stat.cc index 2ac2218df..8c3a9042d 100644 --- a/test/syscalls/linux/stat.cc +++ b/test/syscalls/linux/stat.cc @@ -783,16 +783,20 @@ TEST_F(StatTest, StatxInvalidFlags) { SyscallFailsWithErrno(EINVAL)); } -TEST_F(StatTest, StatxIgnoreNoAutomount) { - SKIP_IF(!IsRunningOnGvisor() && statx(-1, nullptr, 0, 0, nullptr) < 0 && - errno == ENOSYS); +// TODO(b/270247637): AT_NO_AUTOMOUNT flag has no effect because gVisor does +// not support automount yet. +TEST_F(StatTest, StatIgnoreNoAutomount) { + if (IsRunningOnGvisor() || statx(-1, nullptr, 0, 0, nullptr) == 0 || + errno != ENOSYS) { + struct kernel_statx stx; + EXPECT_THAT( + statx(-1, test_file_name_.c_str(), AT_NO_AUTOMOUNT, STATX_ALL, &stx), + SyscallSucceeds()); + } - // NOTE(b/270219255): AT_NO_AUTOMOUNT flag has no effect because gVisor does - // not support automount. - struct kernel_statx stx; - EXPECT_THAT( - statx(-1, test_file_name_.c_str(), AT_NO_AUTOMOUNT, STATX_ALL, &stx), - SyscallSucceeds()); + struct stat st; + EXPECT_THAT(fstatat(AT_FDCWD, test_file_name_.c_str(), &st, AT_NO_AUTOMOUNT), + SyscallSucceeds()); } } // namespace