From 3174f947e2ebaa21c366a4080efbe449e44b4c7c Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Wed, 25 Nov 2009 12:05:41 +0000 Subject: [PATCH] Add support for accept4 system call based on patch from Dodji Seketeli. Part fix for #215973. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@10955 --- coregrind/m_syswrap/syswrap-amd64-linux.c | 20 +++++++++++++++++++- coregrind/m_syswrap/syswrap-ppc32-linux.c | 8 ++++++++ coregrind/m_syswrap/syswrap-ppc64-linux.c | 9 +++++++++ coregrind/m_syswrap/syswrap-x86-linux.c | 9 +++++++++ include/vki/vki-linux.h | 1 + include/vki/vki-scnums-amd64-linux.h | 2 +- 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/coregrind/m_syswrap/syswrap-amd64-linux.c b/coregrind/m_syswrap/syswrap-amd64-linux.c index 89eab0d558..79aa230631 100644 --- a/coregrind/m_syswrap/syswrap-amd64-linux.c +++ b/coregrind/m_syswrap/syswrap-amd64-linux.c @@ -349,6 +349,7 @@ DECL_TEMPLATE(amd64_linux, sys_setsockopt); DECL_TEMPLATE(amd64_linux, sys_getsockopt); DECL_TEMPLATE(amd64_linux, sys_connect); DECL_TEMPLATE(amd64_linux, sys_accept); +DECL_TEMPLATE(amd64_linux, sys_accept4); DECL_TEMPLATE(amd64_linux, sys_sendto); DECL_TEMPLATE(amd64_linux, sys_recvfrom); DECL_TEMPLATE(amd64_linux, sys_sendmsg); @@ -684,6 +685,23 @@ POST(sys_accept) SET_STATUS_from_SysRes(r); } +PRE(sys_accept4) +{ + *flags |= SfMayBlock; + PRINT("sys_accept4 ( %ld, %#lx, %ld, %ld )",ARG1,ARG2,ARG3,ARG4); + PRE_REG_READ4(long, "accept4", + int, s, struct sockaddr *, addr, int, *addrlen, int, flags); + ML_(generic_PRE_sys_accept)(tid, ARG1,ARG2,ARG3); +} +POST(sys_accept4) +{ + SysRes r; + vg_assert(SUCCESS); + r = ML_(generic_POST_sys_accept)(tid, VG_(mk_SysRes_Success)(RES), + ARG1,ARG2,ARG3); + SET_STATUS_from_SysRes(r); +} + PRE(sys_sendto) { *flags |= SfMayBlock; @@ -1368,7 +1386,7 @@ const SyscallTableEntry ML_(syscall_table)[] = { LINX_(__NR_fallocate, sys_fallocate), // 285 LINXY(__NR_timerfd_settime, sys_timerfd_settime), // 286 LINXY(__NR_timerfd_gettime, sys_timerfd_gettime), // 287 - // (__NR_paccept, sys_ni_syscall) // 288 + PLAXY(__NR_accept4, sys_accept4), // 288 LINXY(__NR_signalfd4, sys_signalfd4), // 289 LINX_(__NR_eventfd2, sys_eventfd2), // 290 diff --git a/coregrind/m_syswrap/syswrap-ppc32-linux.c b/coregrind/m_syswrap/syswrap-ppc32-linux.c index fdc8311244..09cd70e820 100644 --- a/coregrind/m_syswrap/syswrap-ppc32-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc32-linux.c @@ -457,6 +457,13 @@ PRE(sys_socketcall) break; } + case VKI_SYS_ACCEPT4: { + /* int accept(int s, struct sockaddr *addr, int *addrlen, int args); */ + PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) ); + ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 ); + break; + } + case VKI_SYS_SENDTO: /* int sendto(int s, const void *msg, int len, unsigned int flags, @@ -602,6 +609,7 @@ POST(sys_socketcall) break; case VKI_SYS_ACCEPT: + case VKI_SYS_ACCEPT4: /* int accept(int s, struct sockaddr *addr, int *addrlen); */ r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES), ARG2_0, ARG2_1, ARG2_2 ); diff --git a/coregrind/m_syswrap/syswrap-ppc64-linux.c b/coregrind/m_syswrap/syswrap-ppc64-linux.c index 6c3cb1b20b..eb7943678e 100644 --- a/coregrind/m_syswrap/syswrap-ppc64-linux.c +++ b/coregrind/m_syswrap/syswrap-ppc64-linux.c @@ -484,6 +484,13 @@ PRE(sys_socketcall) break; } + case VKI_SYS_ACCEPT4: { + /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */ + PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) ); + ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 ); + break; + } + case VKI_SYS_SENDTO: /* int sendto(int s, const void *msg, int len, unsigned int flags, @@ -629,7 +636,9 @@ POST(sys_socketcall) break; case VKI_SYS_ACCEPT: + case VKI_SYS_ACCEPT4: /* int accept(int s, struct sockaddr *addr, int *addrlen); */ + /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */ r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES), ARG2_0, ARG2_1, ARG2_2 ); SET_STATUS_from_SysRes(r); diff --git a/coregrind/m_syswrap/syswrap-x86-linux.c b/coregrind/m_syswrap/syswrap-x86-linux.c index 1f91b50409..1d3b436fb4 100644 --- a/coregrind/m_syswrap/syswrap-x86-linux.c +++ b/coregrind/m_syswrap/syswrap-x86-linux.c @@ -1475,6 +1475,13 @@ PRE(sys_socketcall) break; } + case VKI_SYS_ACCEPT4: { + /*int accept(int s, struct sockaddr *add, int *addrlen, int flags)*/ + PRE_MEM_READ( "socketcall.accept4(args)", ARG2, 4*sizeof(Addr) ); + ML_(generic_PRE_sys_accept)( tid, ARG2_0, ARG2_1, ARG2_2 ); + break; + } + case VKI_SYS_SENDTO: /* int sendto(int s, const void *msg, int len, unsigned int flags, @@ -1620,7 +1627,9 @@ POST(sys_socketcall) break; case VKI_SYS_ACCEPT: + case VKI_SYS_ACCEPT4: /* int accept(int s, struct sockaddr *addr, int *addrlen); */ + /* int accept4(int s, struct sockaddr *addr, int *addrlen, int flags); */ r = ML_(generic_POST_sys_accept)( tid, VG_(mk_SysRes_Success)(RES), ARG2_0, ARG2_1, ARG2_2 ); SET_STATUS_from_SysRes(r); diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h index 20b23d73d0..073227152f 100644 --- a/include/vki/vki-linux.h +++ b/include/vki/vki-linux.h @@ -525,6 +525,7 @@ typedef struct vki_sigevent { #define VKI_SYS_GETSOCKOPT 15 /* sys_getsockopt(2) */ #define VKI_SYS_SENDMSG 16 /* sys_sendmsg(2) */ #define VKI_SYS_RECVMSG 17 /* sys_recvmsg(2) */ +#define VKI_SYS_ACCEPT4 18 /* sys_accept4(2) */ enum vki_sock_type { VKI_SOCK_STREAM = 1, diff --git a/include/vki/vki-scnums-amd64-linux.h b/include/vki/vki-scnums-amd64-linux.h index 1a2125f104..d2fcc3bc0f 100644 --- a/include/vki/vki-scnums-amd64-linux.h +++ b/include/vki/vki-scnums-amd64-linux.h @@ -369,7 +369,7 @@ #define __NR_fallocate 285 #define __NR_timerfd_settime 286 #define __NR_timerfd_gettime 287 -#define __NR_paccept 288 +#define __NR_accept4 288 #define __NR_signalfd4 289 #define __NR_eventfd2 290 #define __NR_epoll_create1 291 -- 2.47.2