|
From: <sv...@va...> - 2010-09-02 08:23:45
|
Author: tom
Date: 2010-09-02 09:23:35 +0100 (Thu, 02 Sep 2010)
New Revision: 11316
Log:
Add support for F_DUPFD_CLOEXEC. Fixes #238696.
Modified:
trunk/coregrind/m_syswrap/syswrap-linux.c
trunk/include/vki/vki-linux.h
Modified: trunk/coregrind/m_syswrap/syswrap-linux.c
===================================================================
--- trunk/coregrind/m_syswrap/syswrap-linux.c 2010-09-01 15:14:02 UTC (rev 11315)
+++ trunk/coregrind/m_syswrap/syswrap-linux.c 2010-09-02 08:23:35 UTC (rev 11316)
@@ -3582,6 +3582,7 @@
// 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_SETLEASE:
@@ -3634,6 +3635,15 @@
ML_(record_fd_open_named)(tid, RES);
}
}
+ else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
+ if (!ML_(fd_allowed)(RES, "fcntl(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);
+ }
+ }
}
// XXX: wrapper only suitable for 32-bit systems
@@ -3654,6 +3664,7 @@
// 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_SETLEASE:
@@ -3699,6 +3710,15 @@
ML_(record_fd_open_named)(tid, RES);
}
}
+ else if (ARG2 == VKI_F_DUPFD_CLOEXEC) {
+ if (!ML_(fd_allowed)(RES, "fcntl64(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);
+ }
+ }
}
/* ---------------------------------------------------------------------
Modified: trunk/include/vki/vki-linux.h
===================================================================
--- trunk/include/vki/vki-linux.h 2010-09-01 15:14:02 UTC (rev 11315)
+++ trunk/include/vki/vki-linux.h 2010-09-02 08:23:35 UTC (rev 11316)
@@ -1296,11 +1296,18 @@
// From linux-2.6.8.1/include/linux/fcntl.h
//----------------------------------------------------------------------
-#define VKI_F_SETLEASE (VKI_F_LINUX_SPECIFIC_BASE+0)
-#define VKI_F_GETLEASE (VKI_F_LINUX_SPECIFIC_BASE+1)
+#define VKI_F_SETLEASE (VKI_F_LINUX_SPECIFIC_BASE + 0)
+#define VKI_F_GETLEASE (VKI_F_LINUX_SPECIFIC_BASE + 1)
-#define VKI_F_NOTIFY (VKI_F_LINUX_SPECIFIC_BASE+2)
+#define VKI_F_CANCELLK (VKI_F_LINUX_SPECIFIC_BASE + 5)
+#define VKI_F_DUPFD_CLOEXEC (VKI_F_LINUX_SPECIFIC_BASE + 6)
+
+#define VKI_F_NOTIFY (VKI_F_LINUX_SPECIFIC_BASE + 2)
+
+#define VKI_F_SETPIPE_SZ (VKI_F_LINUX_SPECIFIC_BASE + 7)
+#define VKI_F_GETPIPE_SZ (VKI_F_LINUX_SPECIFIC_BASE + 8)
+
//----------------------------------------------------------------------
// From linux-2.6.8.1/include/linux/sysctl.h
//----------------------------------------------------------------------
|