* Return true if specified path (in user-space) matches.
*/
static int
-upathmatch(struct tcb *tcp, unsigned long upath)
+upathmatch(struct tcb *const tcp, const kernel_ureg_t upath)
{
char path[PATH_MAX + 1];
switch (s->sen) {
case SEN_dup2:
case SEN_dup3:
+ case SEN_kexec_file_load:
case SEN_sendfile:
case SEN_sendfile64:
case SEN_tee:
case SEN_faccessat:
case SEN_fchmodat:
case SEN_fchownat:
+ case SEN_fstatat64:
case SEN_futimesat:
case SEN_inotify_add_watch:
case SEN_mkdirat:
case SEN_mknodat:
+ case SEN_name_to_handle_at:
case SEN_newfstatat:
case SEN_openat:
- case SEN_pipe2:
case SEN_readlinkat:
case SEN_unlinkat:
case SEN_utimensat:
case SEN_mmap:
case SEN_mmap_4koff:
case SEN_mmap_pgoff:
+ case SEN_ARCH_mmap:
/* x, x, x, x, fd */
return fdmatch(tcp, tcp->u_arg[4]);
upathmatch(tcp, tcp->u_arg[0]) ||
upathmatch(tcp, tcp->u_arg[2]);
+ case SEN_copy_file_range:
case SEN_splice:
- /* fd, x, fd, x, x */
+ /* fd, x, fd, x, x, x */
return fdmatch(tcp, tcp->u_arg[0]) ||
fdmatch(tcp, tcp->u_arg[2]);
{
int i, j;
int nfds;
- long *args, oldargs[5];
- unsigned fdsize;
+ kernel_ureg_t *args;
+ kernel_ureg_t select_args[5];
+ unsigned int oldselect_args[5];
+ unsigned int fdsize;
fd_set *fds;
- args = tcp->u_arg;
if (SEN_oldselect == s->sen) {
- if (umoven(tcp, tcp->u_arg[0], sizeof oldargs,
- oldargs) < 0)
- {
- error_msg("umoven() failed");
- return 0;
+ if (sizeof(*select_args) == sizeof(*oldselect_args)) {
+ if (umove(tcp, tcp->u_arg[0], &select_args)) {
+ return 0;
+ }
+ } else {
+ unsigned int n;
+
+ if (umove(tcp, tcp->u_arg[0], &oldselect_args)) {
+ return 0;
+ }
+
+ for (n = 0; n < 5; ++n) {
+ select_args[n] = oldselect_args[n];
+ }
}
- args = oldargs;
+ args = select_args;
+ } else {
+ args = tcp->u_arg;
}
/* Kernel truncates arg[0] to int, we do the same. */
if (args[i] == 0)
continue;
if (umoven(tcp, args[i], fdsize, fds) < 0) {
- error_msg("umoven() failed");
continue;
}
for (j = 0;; j++) {
{
struct pollfd fds;
unsigned nfds;
- unsigned long start, cur, end;
+ kernel_ureg_t start, cur, end;
start = tcp->u_arg[0];
nfds = tcp->u_arg[1];
return 0;
for (cur = start; cur < end; cur += sizeof(fds))
- if ((umoven(tcp, cur, sizeof fds, &fds) == 0)
+ if ((umove(tcp, cur, &fds) == 0)
&& fdmatch(tcp, fds.fd))
return 1;
case SEN_memfd_create:
case SEN_perf_event_open:
case SEN_pipe:
+ case SEN_pipe2:
case SEN_printargs:
case SEN_socket:
case SEN_socketpair:
case SEN_timerfd_create:
case SEN_timerfd_gettime:
case SEN_timerfd_settime:
+ case SEN_userfaultfd:
/*
* These have TRACE_FILE or TRACE_DESCRIPTOR or TRACE_NETWORK set,
* but they don't have any file descriptor or path args to test.