DECL_TEMPLATE(linux, sys_perf_counter_open);
DECL_TEMPLATE(linux, sys_preadv);
DECL_TEMPLATE(linux, sys_pwritev);
+DECL_TEMPLATE(linux, sys_dup3);
// POSIX, but various sub-cases differ between Linux and Darwin.
DECL_TEMPLATE(linux, sys_fcntl);
LINX_(__NR_eventfd2, sys_eventfd2), // 290
LINXY(__NR_epoll_create1, sys_epoll_create1), // 291
- // (__NR_dup3, sys_ni_syscall) // 292
+ LINXY(__NR_dup3, sys_dup3), // 292
LINXY(__NR_pipe2, sys_pipe2), // 293
LINXY(__NR_inotify_init1, sys_inotify_init1), // 294
}
}
+PRE(sys_dup3)
+{
+ PRINT("sys_dup3 ( %ld, %ld, %ld )", ARG1,ARG2,ARG3);
+ PRE_REG_READ3(long, "dup3", unsigned int, oldfd, unsigned int, newfd, int, flags);
+ if (!ML_(fd_allowed)(ARG2, "dup3", tid, True))
+ SET_STATUS_Failure( VKI_EBADF );
+}
+
+POST(sys_dup3)
+{
+ vg_assert(SUCCESS);
+ if (VG_(clo_track_fds))
+ ML_(record_fd_open_named)(tid, RES);
+}
+
PRE(sys_quotactl)
{
PRINT("sys_quotactl (0x%lx, %#lx, 0x%lx, 0x%lx )", ARG1,ARG2,ARG3, ARG4);
LINXY(__NR_signalfd4, sys_signalfd4), // 313
LINX_(__NR_eventfd2, sys_eventfd2), // 314
LINXY(__NR_epoll_create1, sys_epoll_create1), // 315
- // (__NR_dup3, sys_ni_syscall) // 316
+ LINXY(__NR_dup3, sys_dup3), // 316
LINXY(__NR_pipe2, sys_pipe2), // 317
LINXY(__NR_inotify_init1, sys_inotify_init1), // 318
LINXY(__NR_perf_counter_open, sys_perf_counter_open),// 319
LINXY(__NR_signalfd4, sys_signalfd4), // 313
LINX_(__NR_eventfd2, sys_eventfd2), // 314
LINXY(__NR_epoll_create1, sys_epoll_create1), // 315
- // (__NR_dup3, sys_ni_syscall) // 316
+ LINXY(__NR_dup3, sys_dup3), // 316
LINXY(__NR_pipe2, sys_pipe2), // 317
LINXY(__NR_inotify_init1, sys_inotify_init1), // 318
LINXY(__NR_perf_counter_open, sys_perf_counter_open),// 319
LINX_(__NR_eventfd2, sys_eventfd2), // 328
LINXY(__NR_epoll_create1, sys_epoll_create1), // 329
- // (__NR_dup3, sys_ni_syscall) // 330
+ LINXY(__NR_dup3, sys_dup3), // 330
LINXY(__NR_pipe2, sys_pipe2), // 331
LINXY(__NR_inotify_init1, sys_inotify_init1), // 332
LINXY(__NR_preadv, sys_preadv), // 333