mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 10:05:29 +00:00
Merged r9185 (fix up getsockopt mess) from the DARWIN branch, minus the
Darwin-specific parts. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@9186
This commit is contained in:
parent
b71a8e5966
commit
3bfae3eec1
@ -69,6 +69,13 @@ void
|
||||
ML_(notify_aspacem_and_tool_of_mmap) ( Addr a, SizeT len, UInt prot,
|
||||
UInt mm_flags, Int fd, Off64T offset );
|
||||
|
||||
extern void
|
||||
ML_(buf_and_len_pre_check) ( ThreadId tid, Addr buf_p, Addr buflen_p,
|
||||
Char* buf_s, Char* buflen_s );
|
||||
extern void
|
||||
ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res,
|
||||
Addr buf_p, Addr buflen_p, Char* s );
|
||||
|
||||
|
||||
DECL_TEMPLATE(generic, sys_ni_syscall); // * P -- unimplemented
|
||||
DECL_TEMPLATE(generic, sys_exit);
|
||||
@ -220,8 +227,6 @@ extern void ML_(generic_PRE_sys_recv) ( TId, UW, UW, UW );
|
||||
extern void ML_(generic_POST_sys_recv) ( TId, UW, UW, UW, UW );
|
||||
extern void ML_(generic_PRE_sys_connect) ( TId, UW, UW, UW );
|
||||
extern void ML_(generic_PRE_sys_setsockopt) ( TId, UW, UW, UW, UW, UW );
|
||||
extern void ML_(generic_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW );
|
||||
extern void ML_(generic_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
|
||||
extern void ML_(generic_PRE_sys_getsockname) ( TId, UW, UW, UW );
|
||||
extern void ML_(generic_POST_sys_getsockname) ( TId, SR, UW, UW, UW );
|
||||
extern void ML_(generic_PRE_sys_getpeername) ( TId, UW, UW, UW );
|
||||
|
||||
@ -252,11 +252,13 @@ DECL_TEMPLATE(linux, sys_lookup_dcookie); // (*/32/64) L
|
||||
#define UW UWord
|
||||
#define SR SysRes
|
||||
|
||||
extern void ML_(linux_PRE_sys_msgsnd) ( TId, UW, UW, UW, UW );
|
||||
extern void ML_(linux_PRE_sys_msgrcv) ( TId, UW, UW, UW, UW, UW );
|
||||
extern void ML_(linux_POST_sys_msgrcv) ( TId, UW, UW, UW, UW, UW, UW );
|
||||
extern void ML_(linux_PRE_sys_msgctl) ( TId, UW, UW, UW );
|
||||
extern void ML_(linux_POST_sys_msgctl) ( TId, UW, UW, UW, UW );
|
||||
extern void ML_(linux_PRE_sys_msgsnd) ( TId, UW, UW, UW, UW );
|
||||
extern void ML_(linux_PRE_sys_msgrcv) ( TId, UW, UW, UW, UW, UW );
|
||||
extern void ML_(linux_POST_sys_msgrcv) ( TId, UW, UW, UW, UW, UW, UW );
|
||||
extern void ML_(linux_PRE_sys_msgctl) ( TId, UW, UW, UW );
|
||||
extern void ML_(linux_POST_sys_msgctl) ( TId, UW, UW, UW, UW );
|
||||
extern void ML_(linux_PRE_sys_getsockopt) ( TId, UW, UW, UW, UW, UW );
|
||||
extern void ML_(linux_POST_sys_getsockopt) ( TId, SR, UW, UW, UW, UW, UW );
|
||||
|
||||
#undef TId
|
||||
#undef UW
|
||||
|
||||
@ -641,13 +641,13 @@ PRE(sys_getsockopt)
|
||||
PRE_REG_READ5(long, "getsockopt",
|
||||
int, s, int, level, int, optname,
|
||||
void *, optval, int, *optlen);
|
||||
ML_(generic_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
|
||||
ML_(linux_PRE_sys_getsockopt)(tid, ARG1,ARG2,ARG3,ARG4,ARG5);
|
||||
}
|
||||
POST(sys_getsockopt)
|
||||
{
|
||||
vg_assert(SUCCESS);
|
||||
ML_(generic_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG1,ARG2,ARG3,ARG4,ARG5);
|
||||
ML_(linux_POST_sys_getsockopt)(tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG1,ARG2,ARG3,ARG4,ARG5);
|
||||
}
|
||||
|
||||
PRE(sys_connect)
|
||||
|
||||
@ -947,9 +947,8 @@ static UInt deref_UInt ( ThreadId tid, Addr a, Char* s )
|
||||
return *a_p;
|
||||
}
|
||||
|
||||
static
|
||||
void buf_and_len_pre_check( ThreadId tid, Addr buf_p, Addr buflen_p,
|
||||
Char* buf_s, Char* buflen_s )
|
||||
void ML_(buf_and_len_pre_check) ( ThreadId tid, Addr buf_p, Addr buflen_p,
|
||||
Char* buf_s, Char* buflen_s )
|
||||
{
|
||||
if (VG_(tdict).track_pre_mem_write) {
|
||||
UInt buflen_in = deref_UInt( tid, buflen_p, buflen_s);
|
||||
@ -959,9 +958,8 @@ void buf_and_len_pre_check( ThreadId tid, Addr buf_p, Addr buflen_p,
|
||||
}
|
||||
}
|
||||
|
||||
static
|
||||
void buf_and_len_post_check( ThreadId tid, SysRes res,
|
||||
Addr buf_p, Addr buflen_p, Char* s )
|
||||
void ML_(buf_and_len_post_check) ( ThreadId tid, SysRes res,
|
||||
Addr buf_p, Addr buflen_p, Char* s )
|
||||
{
|
||||
if (!res.isError && VG_(tdict).track_post_mem_write) {
|
||||
UInt buflen_out = deref_UInt( tid, buflen_p, s);
|
||||
@ -1244,9 +1242,9 @@ ML_(generic_PRE_sys_accept) ( ThreadId tid,
|
||||
Addr addr_p = arg1;
|
||||
Addr addrlen_p = arg2;
|
||||
if (addr_p != (Addr)NULL)
|
||||
buf_and_len_pre_check ( tid, addr_p, addrlen_p,
|
||||
"socketcall.accept(addr)",
|
||||
"socketcall.accept(addrlen_in)" );
|
||||
ML_(buf_and_len_pre_check) ( tid, addr_p, addrlen_p,
|
||||
"socketcall.accept(addr)",
|
||||
"socketcall.accept(addrlen_in)" );
|
||||
}
|
||||
|
||||
SysRes
|
||||
@ -1263,8 +1261,8 @@ ML_(generic_POST_sys_accept) ( ThreadId tid,
|
||||
Addr addr_p = arg1;
|
||||
Addr addrlen_p = arg2;
|
||||
if (addr_p != (Addr)NULL)
|
||||
buf_and_len_post_check ( tid, res, addr_p, addrlen_p,
|
||||
"socketcall.accept(addrlen_out)" );
|
||||
ML_(buf_and_len_post_check) ( tid, res, addr_p, addrlen_p,
|
||||
"socketcall.accept(addrlen_out)" );
|
||||
if (VG_(clo_track_fds))
|
||||
ML_(record_fd_open_nameless)(tid, res.res);
|
||||
}
|
||||
@ -1318,9 +1316,9 @@ ML_(generic_PRE_sys_recvfrom) ( ThreadId tid,
|
||||
Addr fromlen_p = arg5;
|
||||
PRE_MEM_WRITE( "socketcall.recvfrom(buf)", buf_p, len );
|
||||
if (from_p != (Addr)NULL)
|
||||
buf_and_len_pre_check ( tid, from_p, fromlen_p,
|
||||
"socketcall.recvfrom(from)",
|
||||
"socketcall.recvfrom(fromlen_in)" );
|
||||
ML_(buf_and_len_pre_check) ( tid, from_p, fromlen_p,
|
||||
"socketcall.recvfrom(from)",
|
||||
"socketcall.recvfrom(fromlen_in)" );
|
||||
}
|
||||
|
||||
void
|
||||
@ -1336,8 +1334,8 @@ ML_(generic_POST_sys_recvfrom) ( ThreadId tid,
|
||||
|
||||
vg_assert(!res.isError); /* guaranteed by caller */
|
||||
if (from_p != (Addr)NULL)
|
||||
buf_and_len_post_check ( tid, res, from_p, fromlen_p,
|
||||
"socketcall.recvfrom(fromlen_out)" );
|
||||
ML_(buf_and_len_post_check) ( tid, res, from_p, fromlen_p,
|
||||
"socketcall.recvfrom(fromlen_out)" );
|
||||
POST_MEM_WRITE( buf_p, len );
|
||||
}
|
||||
|
||||
@ -1401,64 +1399,6 @@ ML_(generic_PRE_sys_setsockopt) ( ThreadId tid,
|
||||
|
||||
/* ------ */
|
||||
|
||||
void
|
||||
ML_(generic_PRE_sys_getsockopt) ( ThreadId tid,
|
||||
UWord arg0, UWord arg1, UWord arg2,
|
||||
UWord arg3, UWord arg4 )
|
||||
{
|
||||
/* int getsockopt(int s, int level, int optname,
|
||||
void *optval, socklen_t *optlen); */
|
||||
Addr optval_p = arg3;
|
||||
Addr optlen_p = arg4;
|
||||
/* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
|
||||
if (optval_p != (Addr)NULL) {
|
||||
buf_and_len_pre_check ( tid, optval_p, optlen_p,
|
||||
"socketcall.getsockopt(optval)",
|
||||
"socketcall.getsockopt(optlen)" );
|
||||
if (arg1 == VKI_SOL_SCTP &&
|
||||
(arg2 == VKI_SCTP_GET_PEER_ADDRS || arg2 == VKI_SCTP_GET_LOCAL_ADDRS)) {
|
||||
struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
|
||||
int address_bytes = sizeof(struct vki_sockaddr_in6) * ga->addr_num;
|
||||
PRE_MEM_WRITE( "socketcall.getsockopt(optval.addrs)", (Addr)ga->addrs, address_bytes );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ML_(generic_POST_sys_getsockopt) ( ThreadId tid,
|
||||
SysRes res,
|
||||
UWord arg0, UWord arg1, UWord arg2,
|
||||
UWord arg3, UWord arg4 )
|
||||
{
|
||||
Addr optval_p = arg3;
|
||||
Addr optlen_p = arg4;
|
||||
vg_assert(!res.isError); /* guaranteed by caller */
|
||||
if (optval_p != (Addr)NULL) {
|
||||
buf_and_len_post_check ( tid, res, optval_p, optlen_p,
|
||||
"socketcall.getsockopt(optlen_out)" );
|
||||
if (arg1 == VKI_SOL_SCTP &&
|
||||
(arg2 == VKI_SCTP_GET_PEER_ADDRS || arg2 == VKI_SCTP_GET_LOCAL_ADDRS)) {
|
||||
struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
|
||||
struct vki_sockaddr *a = ga->addrs;
|
||||
int i;
|
||||
for (i = 0; i < ga->addr_num; i++) {
|
||||
int sl = 0;
|
||||
if (a->sa_family == VKI_AF_INET)
|
||||
sl = sizeof(struct vki_sockaddr_in);
|
||||
else if (a->sa_family == VKI_AF_INET6)
|
||||
sl = sizeof(struct vki_sockaddr_in6);
|
||||
else {
|
||||
VG_(message)(Vg_UserMsg, "Warning: getsockopt: unhandled address type %d", a->sa_family);
|
||||
}
|
||||
a = (struct vki_sockaddr*)((char*)a + sl);
|
||||
}
|
||||
POST_MEM_WRITE( (Addr)ga->addrs, (char*)a - (char*)ga->addrs );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* ------ */
|
||||
|
||||
void
|
||||
ML_(generic_PRE_sys_getsockname) ( ThreadId tid,
|
||||
UWord arg0, UWord arg1, UWord arg2 )
|
||||
@ -1467,9 +1407,9 @@ ML_(generic_PRE_sys_getsockname) ( ThreadId tid,
|
||||
Addr name_p = arg1;
|
||||
Addr namelen_p = arg2;
|
||||
/* Nb: name_p cannot be NULL */
|
||||
buf_and_len_pre_check ( tid, name_p, namelen_p,
|
||||
"socketcall.getsockname(name)",
|
||||
"socketcall.getsockname(namelen_in)" );
|
||||
ML_(buf_and_len_pre_check) ( tid, name_p, namelen_p,
|
||||
"socketcall.getsockname(name)",
|
||||
"socketcall.getsockname(namelen_in)" );
|
||||
}
|
||||
|
||||
void
|
||||
@ -1480,8 +1420,8 @@ ML_(generic_POST_sys_getsockname) ( ThreadId tid,
|
||||
Addr name_p = arg1;
|
||||
Addr namelen_p = arg2;
|
||||
vg_assert(!res.isError); /* guaranteed by caller */
|
||||
buf_and_len_post_check ( tid, res, name_p, namelen_p,
|
||||
"socketcall.getsockname(namelen_out)" );
|
||||
ML_(buf_and_len_post_check) ( tid, res, name_p, namelen_p,
|
||||
"socketcall.getsockname(namelen_out)" );
|
||||
}
|
||||
|
||||
/* ------ */
|
||||
@ -1494,9 +1434,9 @@ ML_(generic_PRE_sys_getpeername) ( ThreadId tid,
|
||||
Addr name_p = arg1;
|
||||
Addr namelen_p = arg2;
|
||||
/* Nb: name_p cannot be NULL */
|
||||
buf_and_len_pre_check ( tid, name_p, namelen_p,
|
||||
"socketcall.getpeername(name)",
|
||||
"socketcall.getpeername(namelen_in)" );
|
||||
ML_(buf_and_len_pre_check) ( tid, name_p, namelen_p,
|
||||
"socketcall.getpeername(name)",
|
||||
"socketcall.getpeername(namelen_in)" );
|
||||
}
|
||||
|
||||
void
|
||||
@ -1507,8 +1447,8 @@ ML_(generic_POST_sys_getpeername) ( ThreadId tid,
|
||||
Addr name_p = arg1;
|
||||
Addr namelen_p = arg2;
|
||||
vg_assert(!res.isError); /* guaranteed by caller */
|
||||
buf_and_len_post_check ( tid, res, name_p, namelen_p,
|
||||
"socketcall.getpeername(namelen_out)" );
|
||||
ML_(buf_and_len_post_check) ( tid, res, name_p, namelen_p,
|
||||
"socketcall.getpeername(namelen_out)" );
|
||||
}
|
||||
|
||||
/* ------ */
|
||||
|
||||
@ -3155,6 +3155,72 @@ POST(sys_lookup_dcookie)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* ---------------------------------------------------------------------
|
||||
socketcall wrapper helpers
|
||||
------------------------------------------------------------------ */
|
||||
|
||||
void
|
||||
ML_(linux_PRE_sys_getsockopt) ( ThreadId tid,
|
||||
UWord arg0, UWord arg1, UWord arg2,
|
||||
UWord arg3, UWord arg4 )
|
||||
{
|
||||
/* int getsockopt(int s, int level, int optname,
|
||||
void *optval, socklen_t *optlen); */
|
||||
Addr optval_p = arg3;
|
||||
Addr optlen_p = arg4;
|
||||
/* vg_assert(sizeof(socklen_t) == sizeof(UInt)); */
|
||||
if (optval_p != (Addr)NULL) {
|
||||
ML_(buf_and_len_pre_check) ( tid, optval_p, optlen_p,
|
||||
"socketcall.getsockopt(optval)",
|
||||
"socketcall.getsockopt(optlen)" );
|
||||
if (arg1 == VKI_SOL_SCTP &&
|
||||
(arg2 == VKI_SCTP_GET_PEER_ADDRS ||
|
||||
arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
|
||||
{
|
||||
struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
|
||||
int address_bytes = sizeof(struct vki_sockaddr_in6) * ga->addr_num;
|
||||
PRE_MEM_WRITE( "socketcall.getsockopt(optval.addrs)",
|
||||
(Addr)ga->addrs, address_bytes );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ML_(linux_POST_sys_getsockopt) ( ThreadId tid,
|
||||
SysRes res,
|
||||
UWord arg0, UWord arg1, UWord arg2,
|
||||
UWord arg3, UWord arg4 )
|
||||
{
|
||||
Addr optval_p = arg3;
|
||||
Addr optlen_p = arg4;
|
||||
vg_assert(!res.isError); /* guaranteed by caller */
|
||||
if (optval_p != (Addr)NULL) {
|
||||
ML_(buf_and_len_post_check) ( tid, res, optval_p, optlen_p,
|
||||
"socketcall.getsockopt(optlen_out)" );
|
||||
if (arg1 == VKI_SOL_SCTP &&
|
||||
(arg2 == VKI_SCTP_GET_PEER_ADDRS ||
|
||||
arg2 == VKI_SCTP_GET_LOCAL_ADDRS))
|
||||
{
|
||||
struct vki_sctp_getaddrs *ga = (struct vki_sctp_getaddrs*)arg3;
|
||||
struct vki_sockaddr *a = ga->addrs;
|
||||
int i;
|
||||
for (i = 0; i < ga->addr_num; i++) {
|
||||
int sl = 0;
|
||||
if (a->sa_family == VKI_AF_INET)
|
||||
sl = sizeof(struct vki_sockaddr_in);
|
||||
else if (a->sa_family == VKI_AF_INET6)
|
||||
sl = sizeof(struct vki_sockaddr_in6);
|
||||
else {
|
||||
VG_(message)(Vg_UserMsg, "Warning: getsockopt: unhandled address type %d", a->sa_family);
|
||||
}
|
||||
a = (struct vki_sockaddr*)((char*)a + sl);
|
||||
}
|
||||
POST_MEM_WRITE( (Addr)ga->addrs, (char*)a - (char*)ga->addrs );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#undef PRE
|
||||
#undef POST
|
||||
|
||||
|
||||
@ -507,8 +507,8 @@ PRE(sys_socketcall)
|
||||
/* int getsockopt(int s, int level, int optname,
|
||||
void *optval, socklen_t *optlen); */
|
||||
PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
|
||||
ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
|
||||
ARG2_3, ARG2_4 );
|
||||
ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
|
||||
ARG2_3, ARG2_4 );
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKNAME:
|
||||
@ -628,9 +628,9 @@ POST(sys_socketcall)
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKOPT:
|
||||
ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG2_0, ARG2_1,
|
||||
ARG2_2, ARG2_3, ARG2_4 );
|
||||
ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG2_0, ARG2_1,
|
||||
ARG2_2, ARG2_3, ARG2_4 );
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKNAME:
|
||||
|
||||
@ -534,8 +534,8 @@ PRE(sys_socketcall)
|
||||
/* int getsockopt(int s, int level, int optname,
|
||||
void *optval, socklen_t *optlen); */
|
||||
PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
|
||||
ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
|
||||
ARG2_3, ARG2_4 );
|
||||
ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
|
||||
ARG2_3, ARG2_4 );
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKNAME:
|
||||
@ -655,9 +655,9 @@ POST(sys_socketcall)
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKOPT:
|
||||
ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG2_0, ARG2_1,
|
||||
ARG2_2, ARG2_3, ARG2_4 );
|
||||
ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG2_0, ARG2_1,
|
||||
ARG2_2, ARG2_3, ARG2_4 );
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKNAME:
|
||||
|
||||
@ -1512,8 +1512,8 @@ PRE(sys_socketcall)
|
||||
/* int getsockopt(int s, int level, int optname,
|
||||
void *optval, socklen_t *optlen); */
|
||||
PRE_MEM_READ( "socketcall.getsockopt(args)", ARG2, 5*sizeof(Addr) );
|
||||
ML_(generic_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
|
||||
ARG2_3, ARG2_4 );
|
||||
ML_(linux_PRE_sys_getsockopt)( tid, ARG2_0, ARG2_1, ARG2_2,
|
||||
ARG2_3, ARG2_4 );
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKNAME:
|
||||
@ -1633,9 +1633,9 @@ POST(sys_socketcall)
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKOPT:
|
||||
ML_(generic_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG2_0, ARG2_1,
|
||||
ARG2_2, ARG2_3, ARG2_4 );
|
||||
ML_(linux_POST_sys_getsockopt)( tid, VG_(mk_SysRes_Success)(RES),
|
||||
ARG2_0, ARG2_1,
|
||||
ARG2_2, ARG2_3, ARG2_4 );
|
||||
break;
|
||||
|
||||
case VKI_SYS_GETSOCKNAME:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user