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
This commit is contained in:
Tom Hughes 2009-11-25 12:05:41 +00:00
parent 25a99cd1eb
commit 3174f947e2
6 changed files with 47 additions and 2 deletions

View File

@ -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

View File

@ -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 );

View File

@ -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);

View File

@ -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);

View File

@ -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,

View File

@ -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