From 7104ded0a56d6aad02e0521c953981a6bfffa48f Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Thu, 9 Feb 2012 12:21:47 +0000 Subject: [PATCH] Add support for the F_GETOWN_EX and F_SETOWN_EX fcntl calls. Patch from Jakub Jelinek to fix BZ#292626. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@12373 --- coregrind/m_syswrap/syswrap-linux.c | 36 +++++++++++++++++++++++++++++ include/vki/vki-amd64-linux.h | 12 ++++++++++ include/vki/vki-arm-linux.h | 12 ++++++++++ include/vki/vki-ppc32-linux.h | 12 ++++++++++ include/vki/vki-ppc64-linux.h | 12 ++++++++++ include/vki/vki-s390x-linux.h | 12 ++++++++++ include/vki/vki-x86-linux.h | 12 ++++++++++ 7 files changed, 108 insertions(+) diff --git a/coregrind/m_syswrap/syswrap-linux.c b/coregrind/m_syswrap/syswrap-linux.c index f0b94edfe4..5a62f5927f 100644 --- a/coregrind/m_syswrap/syswrap-linux.c +++ b/coregrind/m_syswrap/syswrap-linux.c @@ -3790,6 +3790,22 @@ PRE(sys_fcntl) struct flock64 *, lock); break; + case VKI_F_SETOWN_EX: + PRINT("sys_fcntl[F_SETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fcntl", + unsigned int, fd, unsigned int, cmd, + struct vki_f_owner_ex *, arg); + PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex)); + break; + + case VKI_F_GETOWN_EX: + PRINT("sys_fcntl[F_GETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fcntl", + unsigned int, fd, unsigned int, cmd, + struct vki_f_owner_ex *, arg); + PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex)); + break; + default: PRINT("sys_fcntl[UNKNOWN] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3); I_die_here; @@ -3824,6 +3840,8 @@ POST(sys_fcntl) if (VG_(clo_track_fds)) ML_(record_fd_open_named)(tid, RES); } + } else if (ARG2 == VKI_F_GETOWN_EX) { + POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex)); } } @@ -3869,6 +3887,22 @@ PRE(sys_fcntl64) unsigned int, fd, unsigned int, cmd, struct flock64 *, lock); break; + + case VKI_F_SETOWN_EX: + PRINT("sys_fcntl[F_SETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fcntl", + unsigned int, fd, unsigned int, cmd, + struct vki_f_owner_ex *, arg); + PRE_MEM_READ("fcntl(F_SETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex)); + break; + + case VKI_F_GETOWN_EX: + PRINT("sys_fcntl[F_GETOWN_EX] ( %ld, %ld, %ld )", ARG1,ARG2,ARG3); + PRE_REG_READ3(long, "fcntl", + unsigned int, fd, unsigned int, cmd, + struct vki_f_owner_ex *, arg); + PRE_MEM_WRITE("fcntl(F_GETOWN_EX)", ARG3, sizeof(struct vki_f_owner_ex)); + break; } # if defined(VGP_x86_linux) @@ -3899,6 +3933,8 @@ POST(sys_fcntl64) if (VG_(clo_track_fds)) ML_(record_fd_open_named)(tid, RES); } + } else if (ARG2 == VKI_F_GETOWN_EX) { + POST_MEM_WRITE(ARG3, sizeof(struct vki_f_owner_ex)); } } diff --git a/include/vki/vki-amd64-linux.h b/include/vki/vki-amd64-linux.h index 8c0bcbac36..18e458863d 100644 --- a/include/vki/vki-amd64-linux.h +++ b/include/vki/vki-amd64-linux.h @@ -268,6 +268,18 @@ struct vki_sigcontext { #define VKI_F_SETSIG 10 /* for sockets. */ #define VKI_F_GETSIG 11 /* for sockets. */ +#define VKI_F_SETOWN_EX 15 +#define VKI_F_GETOWN_EX 16 + +#define VKI_F_OWNER_TID 0 +#define VKI_F_OWNER_PID 1 +#define VKI_F_OWNER_PGRP 2 + +struct vki_f_owner_ex { + int type; + __vki_kernel_pid_t pid; +}; + #define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */ #define VKI_F_LINUX_SPECIFIC_BASE 1024 diff --git a/include/vki/vki-arm-linux.h b/include/vki/vki-arm-linux.h index 08e4b80329..c06b028d70 100644 --- a/include/vki/vki-arm-linux.h +++ b/include/vki/vki-arm-linux.h @@ -270,6 +270,18 @@ struct vki_sigcontext { #define VKI_F_SETLK64 13 #define VKI_F_SETLKW64 14 +#define VKI_F_SETOWN_EX 15 +#define VKI_F_GETOWN_EX 16 + +#define VKI_F_OWNER_TID 0 +#define VKI_F_OWNER_PID 1 +#define VKI_F_OWNER_PGRP 2 + +struct vki_f_owner_ex { + int type; + __vki_kernel_pid_t pid; +}; + /* for F_[GET|SET]FL */ #define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */ diff --git a/include/vki/vki-ppc32-linux.h b/include/vki/vki-ppc32-linux.h index d0c5ba6b3e..4d7bdf2db9 100644 --- a/include/vki/vki-ppc32-linux.h +++ b/include/vki/vki-ppc32-linux.h @@ -337,6 +337,18 @@ struct vki_sigcontext { #define VKI_F_SETLK64 13 #define VKI_F_SETLKW64 14 +#define VKI_F_SETOWN_EX 15 +#define VKI_F_GETOWN_EX 16 + +#define VKI_F_OWNER_TID 0 +#define VKI_F_OWNER_PID 1 +#define VKI_F_OWNER_PGRP 2 + +struct vki_f_owner_ex { + int type; + __vki_kernel_pid_t pid; +}; + /* for F_[GET|SET]FL */ #define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */ diff --git a/include/vki/vki-ppc64-linux.h b/include/vki/vki-ppc64-linux.h index 6e50b5bb97..a41ad4e74b 100644 --- a/include/vki/vki-ppc64-linux.h +++ b/include/vki/vki-ppc64-linux.h @@ -386,6 +386,18 @@ struct vki_sigcontext { #define VKI_F_SETSIG 10 /* for sockets. */ #define VKI_F_GETSIG 11 /* for sockets. */ +#define VKI_F_SETOWN_EX 15 +#define VKI_F_GETOWN_EX 16 + +#define VKI_F_OWNER_TID 0 +#define VKI_F_OWNER_PID 1 +#define VKI_F_OWNER_PGRP 2 + +struct vki_f_owner_ex { + int type; + __vki_kernel_pid_t pid; +}; + /* for F_[GET|SET]FL */ #define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */ diff --git a/include/vki/vki-s390x-linux.h b/include/vki/vki-s390x-linux.h index 2b5b8615be..53e9bb5145 100644 --- a/include/vki/vki-s390x-linux.h +++ b/include/vki/vki-s390x-linux.h @@ -332,6 +332,18 @@ typedef struct vki_sigaltstack { #define VKI_F_SETSIG 10 /* for sockets. */ #define VKI_F_GETSIG 11 /* for sockets. */ +#define VKI_F_SETOWN_EX 15 +#define VKI_F_GETOWN_EX 16 + +#define VKI_F_OWNER_TID 0 +#define VKI_F_OWNER_PID 1 +#define VKI_F_OWNER_PGRP 2 + +struct vki_f_owner_ex { + int type; + __vki_kernel_pid_t pid; +}; + #define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */ #define VKI_F_LINUX_SPECIFIC_BASE 1024 diff --git a/include/vki/vki-x86-linux.h b/include/vki/vki-x86-linux.h index 2a14104739..1f3d7621f4 100644 --- a/include/vki/vki-x86-linux.h +++ b/include/vki/vki-x86-linux.h @@ -308,6 +308,18 @@ struct vki_sigcontext { #define VKI_F_SETLK64 13 #define VKI_F_SETLKW64 14 +#define VKI_F_SETOWN_EX 15 +#define VKI_F_GETOWN_EX 16 + +#define VKI_F_OWNER_TID 0 +#define VKI_F_OWNER_PID 1 +#define VKI_F_OWNER_PGRP 2 + +struct vki_f_owner_ex { + int type; + __vki_kernel_pid_t pid; +}; + /* for F_[GET|SET]FL */ #define VKI_FD_CLOEXEC 1 /* actually anything with low bit set goes */ -- 2.47.2