*flags |= SfMayBlock;
PRINT("sys_fsync ( %" FMT_REGWORD "u )", ARG1);
PRE_REG_READ1(long, "fsync", unsigned int, fd);
+ if ( !ML_(fd_allowed)(ARG1, "fsync", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_fdatasync)
*flags |= SfMayBlock;
PRINT("sys_fdatasync ( %" FMT_REGWORD "u )", ARG1);
PRE_REG_READ1(long, "fdatasync", unsigned int, fd);
+ if ( !ML_(fd_allowed)(ARG1, "fdatasync", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_msync)
PRE_REG_READ2(long, "fstatfs",
unsigned int, fd, struct statfs *, buf);
PRE_MEM_WRITE( "fstatfs(buf)", ARG2, sizeof(struct vki_statfs) );
+ if ( !ML_(fd_allowed)(ARG1, "fstatfs", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
POST(sys_fstatfs)
PRE_REG_READ3(long, "fstatfs64",
unsigned int, fd, vki_size_t, size, struct statfs64 *, buf);
PRE_MEM_WRITE( "fstatfs64(buf)", ARG3, ARG2 );
+ if ( !ML_(fd_allowed)(ARG1, "fstatfs64", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
POST(sys_fstatfs64)
{
*flags |= SfMayBlock;
PRINT("sys_flock ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2 );
PRE_REG_READ2(long, "flock", unsigned int, fd, unsigned int, operation);
+ if ( !ML_(fd_allowed)(ARG1, "flock", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
// Pre_read a char** argument.
FUSE_COMPATIBLE_MAY_BLOCK();
PRINT("sys_fchdir ( %" FMT_REGWORD "u )", ARG1);
PRE_REG_READ1(long, "fchdir", unsigned int, fd);
+ if ( !ML_(fd_allowed)(ARG1, "fchdir", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_fchown)
FMT_REGWORD "u )", ARG1, ARG2, ARG3);
PRE_REG_READ3(long, "fchown",
unsigned int, fd, vki_uid_t, owner, vki_gid_t, group);
+ if ( !ML_(fd_allowed)(ARG1, "fchown", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_fchmod)
FUSE_COMPATIBLE_MAY_BLOCK();
PRINT("sys_fchmod ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2);
PRE_REG_READ2(long, "fchmod", unsigned int, fildes, vki_mode_t, mode);
+ if ( !ML_(fd_allowed)(ARG1, "fchmod", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
#if !defined(VGP_nanomips_linux) && !defined (VGO_freebsd)
*flags |= SfMayBlock;
PRINT("sys_ftruncate ( %" FMT_REGWORD "u, %" FMT_REGWORD "u )", ARG1, ARG2);
PRE_REG_READ2(long, "ftruncate", unsigned int, fd, unsigned long, length);
+ if ( !ML_(fd_allowed)(ARG1, "ftruncate", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_truncate)
PRE_REG_READ2(long, "ftruncate64",
unsigned int,fd, UWord,length);
#endif
+ if ( !ML_(fd_allowed)(ARG1, "ftruncate64", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_truncate64)
PRE_MEM_READ( "poll(ufds.fd)",
(Addr)(&ufds[i].fd), sizeof(ufds[i].fd) );
if (ML_(safe_to_deref)(&ufds[i].fd, sizeof(ufds[i].fd)) && ufds[i].fd >= 0) {
+ if (!ML_(fd_allowed)(ufds[i].fd, "poll(ufds.fd)", tid, False)) {
+ /* do nothing? Just let fd_allowed produce a warning? */
+ }
PRE_MEM_READ( "poll(ufds.events)",
(Addr)(&ufds[i].events), sizeof(ufds[i].events) );
}
PRE_REG_READ5(long, "fadvise64",
int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
vki_size_t, len, int, advice);
+ if ( !ML_(fd_allowed)(SARG1, "fadvise64", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_fadvise64_64)
PRE_REG_READ6(long, "fadvise64_64",
int, fd, vki_u32, MERGE64_FIRST(offset), vki_u32, MERGE64_SECOND(offset),
vki_u32, MERGE64_FIRST(len), vki_u32, MERGE64_SECOND(len), int, advice);
+ if ( !ML_(fd_allowed)(SARG1, "fadvise64_64", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
/* ---------------------------------------------------------------------
int, dfd, const char *, pathname);
if (ARG5)
PRE_MEM_RASCIIZ( "fanotify_mark(path)", ARG5);
+ if ( !ML_(fd_allowed)(SARG1, "fanotify_mark", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
#else
# error Unexpected word size
#endif
POST(sys_inotify_init1)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "inotify_init", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_mq_open)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "mq_open", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
}
POST(sys_timerfd_create)
{
+ POST_newFd_RES;
if (linux_kernel_2_6_22())
{
/* 2.6.22 kernel: timerfd system call. */
FMT_REGWORD "u )", ARG1, ARG2, ARG3);
PRE_REG_READ3(long, "fchown16",
unsigned int, fd, vki_old_uid_t, owner, vki_old_gid_t, group);
+ if ( !ML_(fd_allowed)(ARG1, "fchown16", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
+
}
/* ---------------------------------------------------------------------
int, fd, char *, name, void *, value, vki_size_t, size);
PRE_MEM_RASCIIZ( "fgetxattr(name)", ARG2 );
PRE_MEM_WRITE( "fgetxattr(value)", ARG3, ARG4 );
+ if ( !ML_(fd_allowed)(SARG1, "fgetxattr", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
+
}
POST(sys_fgetxattr)
{
PRE_REG_READ3(ssize_t, "flistxattr",
int, fd, char *, list, vki_size_t, size);
PRE_MEM_WRITE( "flistxattr(list)", ARG2, ARG3 );
+ if ( !ML_(fd_allowed)(ARG1, "flistxattr", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
+
}
POST(sys_flistxattr)
{
PRINT("sys_fremovexattr ( %ld, %#" FMT_REGWORD "x )", SARG1, ARG2);
PRE_REG_READ2(long, "fremovexattr", int, fd, char *, name);
PRE_MEM_RASCIIZ( "fremovexattr(name)", ARG2 );
+ if ( !ML_(fd_allowed)(SARG1, "fremovexattr", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
+
}
/* ---------------------------------------------------------------------
POST(sys_perf_event_open)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "perf_event_open", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_memfd_create)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "memfd_create", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
{
/* Returns either the abi version or a file descriptor. */
if (ARG3 != VKI_LANDLOCK_CREATE_RULESET_VERSION) {
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "landlock_create_ruleset", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_memfd_secret)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "memfd_secret", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
}
POST(sys_signalfd)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "signalfd", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
}
POST(sys_signalfd4)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "signalfd4", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
int, dfd, const char *, path,
vki_uid_t, owner, vki_gid_t, group);
PRE_MEM_RASCIIZ( "fchownat(path)", ARG2 );
+ if ( !ML_(fd_allowed)(SARG1, "fchownat", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_futimesat)
PRE_MEM_RASCIIZ( "futimesat(filename)", ARG2 );
if (ARG3 != 0)
PRE_MEM_READ( "futimesat(tvp)", ARG3, 2 * sizeof(struct vki_timeval) );
+ if ( !ML_(fd_allowed)(SARG1, "futimesat", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
+
}
PRE(sys_utimensat)
PRE_REG_READ3(long, "fchmodat",
int, dfd, const char *, path, vki_mode_t, mode);
PRE_MEM_RASCIIZ( "fchmodat(path)", ARG2 );
+ if ( !ML_(fd_allowed)(SARG1, "fchmodat", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
+
}
PRE(sys_cachestat)
int, dfd, const char *, path, vki_mode_t, mode,
unsigned int, flags);
PRE_MEM_RASCIIZ( "fchmodat2(pathname)", ARG2 );
+ if ( !ML_(fd_allowed)(SARG1, "fchmodat2", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_faccessat)
PRE_REG_READ3(long, "faccessat",
int, dfd, const char *, pathname, int, mode);
PRE_MEM_RASCIIZ( "faccessat(pathname)", ARG2 );
+ if ( !ML_(fd_allowed)(SARG1, "faccessat", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
+
}
PRE(sys_faccessat2)
PRE_REG_READ4(long, "faccessat2",
int, dfd, const char *, pathname, int, mode, int, flags);
PRE_MEM_RASCIIZ( "faccessat2(pathname)", ARG2 );
+ if ( !ML_(fd_allowed)(SARG1, "faccessat2", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_name_to_handle_at)
POST(sys_open_by_handle_at)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "open_by_handle_at", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
PRE_REG_READ3(long, "finit_module",
int, fd, const char *, params, int, flags);
PRE_MEM_RASCIIZ("finit_module(params)", ARG2);
+ if ( !ML_(fd_allowed)(ARG1, "finit_module", tid, False) )
+ SET_STATUS_Failure( VKI_EBADF );
}
PRE(sys_delete_module)
{
vg_assert(SUCCESS);
if (ARG2 == VKI_F_DUPFD) {
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fcntl(DUPFD)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
}
}
else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fcntl(DUPFD_CLOEXEC)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
{
vg_assert(SUCCESS);
if (ARG2 == VKI_F_DUPFD) {
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
}
}
else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fcntl64(DUPFD_CLOEXEC)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
case VKI_BPF_MAP_GET_FD_BY_ID:
case VKI_BPF_BTF_GET_FD_BY_ID:
case VKI_BPF_RAW_TRACEPOINT_OPEN:
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "bpf", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
break;
case VKI_BPF_PROG_LOAD:
/* Return a file descriptor for loaded program, write into log_buf. */
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "bpf", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
break;
case VKI_BPF_BTF_LOAD:
/* Return a file descriptor for BTF data, write into btf_log_buf. */
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "bpf", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
POST(sys_io_uring_setup)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "io_uring_setup", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_openat2)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "openat2", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_pidfd_open)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "pidfd", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_pidfd_getfd)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "pidfd_getfd", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_open_tree)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "open_tree", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_fsopen)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fsopen", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_fsmount)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fsmount", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_fspick)
{
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "fspick", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );
POST(sys_userfaultfd)
{
vg_assert(SUCCESS);
+ POST_newFd_RES;
if (!ML_(fd_allowed)(RES, "userfaultfd", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure( VKI_EMFILE );