PRE_MEM_RASCIIZ("linkat(path2)", ARG4);
/* Be strict but ignore fd1/fd2 for absolute path1/path2. */
- if (fd1 != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd1, "linkat", tid, False)) {
- SET_STATUS_Failure(VKI_EBADF);
- }
- if (fd2 != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG4, 1)
- && ((HChar *) ARG4)[0] != '/'
- && !ML_(fd_allowed)(fd2, "linkat", tid, False)) {
- SET_STATUS_Failure(VKI_EBADF);
- }
+ ML_(fd_at_check_allowed)(fd1, (const HChar*)ARG2, "linkat(efd)", tid, status);
+ ML_(fd_at_check_allowed)(fd2, (const HChar*)ARG4, "linkat(nfd)", tid, status);
*flags |= SfMayBlock;
}
PRE_MEM_RASCIIZ("symlinkat(path2)", ARG3);
/* Be strict but ignore fd for absolute path2. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG3, 1)
- && ((HChar *) ARG3)[0] != '/'
- && !ML_(fd_allowed)(fd, "symlinkat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG3, "symlinkat", tid, status);
*flags |= SfMayBlock;
}
PRE_MEM_WRITE("readlinkat(buf)", ARG3, ARG4);
/* Be strict but ignore dfd for absolute path. */
- if (dfd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(dfd, "readlinkat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(dfd, (const HChar*)ARG2, "readlinkat", tid, status);
/* Handle the case where readlinkat is looking at /proc/self/path/a.out or
/proc/<pid>/path/a.out. */
PRE_MEM_WRITE("frealpathat(buf)", ARG3, ARG4);
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "frealpathat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "frealpathat", tid, status);
}
POST(sys_frealpathat)
PRE_MEM_RASCIIZ("faccessat(path)", ARG2);
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "faccessat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "faccessat", tid, status);
}
PRE(sys_mknodat)
PRE_MEM_RASCIIZ("mknodat(fname)", ARG2);
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "mknodat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "mknodat", tid, status);
*flags |= SfMayBlock;
}
PRE_MEM_RASCIIZ("fchownat(path)", ARG2);
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "fchownat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "fchownat", tid, status);
}
PRE(sys_fdsync)
PRE_MEM_RASCIIZ("renameat(new)", ARG4);
/* Be strict but ignore fromfd/tofd for absolute old/new. */
- if (fromfd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fromfd, "renameat", tid, False)) {
- SET_STATUS_Failure(VKI_EBADF);
- }
- if (tofd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG4, 1)
- && ((HChar *) ARG4)[0] != '/'
- && !ML_(fd_allowed)(tofd, "renameat", tid, False)) {
- SET_STATUS_Failure(VKI_EBADF);
- }
+ ML_(fd_at_check_allowed)(fromfd, (const HChar*)ARG2, "renameat(fromfd)", tid, status);
+ ML_(fd_at_check_allowed)(tofd, (const HChar*)ARG4, "renameat(tofd)", tid, status);
}
PRE(sys_unlinkat)
PRE_MEM_RASCIIZ("unlinkat(pathname)", ARG2);
/* Be strict but ignore dfd for absolute pathname. */
- if (dfd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(dfd, "unlinkat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(dfd, (const HChar*)ARG2, "unlinkat", tid, status);
}
PRE(sys_fstatat)
PRE_MEM_WRITE("fstatat(buf)", ARG3, sizeof(struct vki_stat));
/* Be strict but ignore fildes for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "fstatat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "fstatat", tid, status);
}
POST(sys_fstatat)
PRE_MEM_RASCIIZ("openat(filename)", ARG2);
+ // @todo PJF use ML_(fd_at_check) and not return early here
/* Be strict but ignore fildes for absolute pathname. */
if (fd != VKI_AT_FDCWD
&& ML_(safe_to_deref)((void *) ARG2, 1)
PRE_MEM_RASCIIZ("fchmodat(path)", ARG2);
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "fchmodat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "fchmodat", tid, status);
}
PRE(sys_mkdirat)
PRE_MEM_RASCIIZ("mkdirat(path)", ARG2);
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "mkdirat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "mkdirat", tid, status);
}
static void do_statvfs_post(struct vki_statvfs *stats, ThreadId tid)
PRE_MEM_READ("utimesys(times)", ARG4, 2 * sizeof(vki_timespec_t));
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG3, 1)
- && ((HChar *) ARG3)[0] != '/'
- && !ML_(fd_allowed)(fd, "utimesys", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG3, "utimesys", tid, status);
break;
}
default:
PRE_MEM_READ("utimensat(times)", ARG3, 2 * sizeof(vki_timespec_t));
/* Be strict but ignore fd for absolute path. */
- if (fd != VKI_AT_FDCWD
- && ML_(safe_to_deref)((void *) ARG2, 1)
- && ((HChar *) ARG2)[0] != '/'
- && !ML_(fd_allowed)(fd, "utimensat", tid, False))
- SET_STATUS_Failure(VKI_EBADF);
+ ML_(fd_at_check_allowed)(fd, (const HChar*)ARG2, "utimensat", tid, status);
}
#endif /* SOLARIS_UTIMENSAT_SYSCALL */