/* These ones use ARG3 as "arg". */
case VKI_F_DUPFD:
+ case VKI_F_DUPFD_CLOEXEC:
case VKI_F_SETFD:
case VKI_F_SETFL:
case VKI_F_DUP2FD:
if (!ML_(fd_allowed)(RES, "fcntl(F_DUPFD)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
- }
- else if (VG_(clo_track_fds))
+ } else if (VG_(clo_track_fds))
+ ML_(record_fd_open_named)(tid, RES);
+ break;
+
+ case VKI_F_DUPFD_CLOEXEC:
+ if (!ML_(fd_allowed)(RES, "fcntl(F_DUPFD_CLOEXEC)", tid, True)) {
+ VG_(close)(RES);
+ SET_STATUS_Failure(VKI_EMFILE);
+ } else if (VG_(clo_track_fds))
ML_(record_fd_open_named)(tid, RES);
break;
if (!ML_(fd_allowed)(RES, "fcntl(F_DUP2FD)", tid, True)) {
VG_(close)(RES);
SET_STATUS_Failure(VKI_EMFILE);
- }
- else if (VG_(clo_track_fds))
+ } else if (VG_(clo_track_fds))
ML_(record_fd_open_named)(tid, RES);
break;
#define VKI_O_LARGEFILE O_LARGEFILE
#define VKI_F_DUPFD F_DUPFD
+#define VKI_F_DUPFD_CLOEXEC F_DUPFD_CLOEXEC
#define VKI_F_GETFD F_GETFD
#define VKI_F_SETFD F_SETFD
#define VKI_F_GETFL F_GETFL
__attribute__((noinline))
static void sys_fcntl3(void)
+{
+ GO(SYS_fcntl, "(DUPFD_CLOEXEC) 3s 0m");
+ SY(SYS_fcntl, x0 - 1, x0 + F_DUPFD_CLOEXEC, x0); FAILx(EBADF);
+}
+
+__attribute__((noinline))
+static void sys_fcntl4(void)
{
GO(SYS_fcntl, "(GETLK) 3s 5m");
SY(SYS_fcntl, x0 - 1, x0 + F_GETLK, x0); FAILx(EBADF);
sys_fcntl();
sys_fcntl2();
sys_fcntl3();
+ sys_fcntl4();
/* SYS_ulimit 63 */
/* XXX Missing wrapper. */