From: Tom Hughes Date: Mon, 18 Jul 2005 22:41:33 +0000 (+0000) Subject: Check each field of the msghdr structure passed to sendmsg/recvmsg X-Git-Tag: svn/VALGRIND_3_0_0~152 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2b08b3a3b01f15f1bef893ab327bbe697ef08572;p=thirdparty%2Fvalgrind.git Check each field of the msghdr structure passed to sendmsg/recvmsg individually to avoid complaints due to uninitialised padding bytes on 64 bit platforms. Also fixed sendmsg to check things which should be initialised (the msghdr structure and the iov array) properly instead of doing a write check for everything. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@4166 --- diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c index ec51a40f1c..6163552c68 100644 --- a/coregrind/m_syswrap/syswrap-generic.c +++ b/coregrind/m_syswrap/syswrap-generic.c @@ -586,45 +586,54 @@ Char *strdupcat ( const Char *s1, const Char *s2, ArenaId aid ) } static -void pre_mem_read_sendmsg ( ThreadId tid, +void pre_mem_read_sendmsg ( ThreadId tid, Bool read, Char *msg, Addr base, SizeT size ) { Char *outmsg = strdupcat ( "socketcall.sendmsg", msg, VG_AR_CORE ); PRE_MEM_READ( outmsg, base, size ); - VG_(arena_free) ( VG_AR_CORE, outmsg ); } static -void pre_mem_write_recvmsg ( ThreadId tid, +void pre_mem_write_recvmsg ( ThreadId tid, Bool read, Char *msg, Addr base, SizeT size ) { Char *outmsg = strdupcat ( "socketcall.recvmsg", msg, VG_AR_CORE ); - PRE_MEM_WRITE( outmsg, base, size ); + if ( read ) + PRE_MEM_READ( outmsg, base, size ); + else + PRE_MEM_WRITE( outmsg, base, size ); VG_(arena_free) ( VG_AR_CORE, outmsg ); } static -void post_mem_write_recvmsg ( ThreadId tid, +void post_mem_write_recvmsg ( ThreadId tid, Bool read, Char *fieldName, Addr base, SizeT size ) { - POST_MEM_WRITE( base, size ); + if ( !read ) + POST_MEM_WRITE( base, size ); } static void msghdr_foreachfield ( ThreadId tid, struct vki_msghdr *msg, - void (*foreach_func)( ThreadId, Char *, Addr, SizeT ) + void (*foreach_func)( ThreadId, Bool, Char *, Addr, SizeT ) ) { if ( !msg ) return; - foreach_func ( tid, "(msg)", (Addr)msg, sizeof( struct vki_msghdr ) ); + foreach_func ( tid, True, "(msg)", (Addr)&msg->msg_name, sizeof( msg->msg_name ) ); + foreach_func ( tid, True, "(msg)", (Addr)&msg->msg_namelen, sizeof( msg->msg_namelen ) ); + foreach_func ( tid, True, "(msg)", (Addr)&msg->msg_iov, sizeof( msg->msg_iov ) ); + foreach_func ( tid, True, "(msg)", (Addr)&msg->msg_iovlen, sizeof( msg->msg_iovlen ) ); + foreach_func ( tid, True, "(msg)", (Addr)&msg->msg_control, sizeof( msg->msg_control ) ); + foreach_func ( tid, True, "(msg)", (Addr)&msg->msg_controllen, sizeof( msg->msg_controllen ) ); + foreach_func ( tid, True, "(msg)", (Addr)&msg->msg_flags, sizeof( msg->msg_flags ) ); if ( msg->msg_name ) - foreach_func ( tid, + foreach_func ( tid, False, "(msg.msg_name)", (Addr)msg->msg_name, msg->msg_namelen ); @@ -632,18 +641,18 @@ void msghdr_foreachfield ( struct vki_iovec *iov = msg->msg_iov; UInt i; - foreach_func ( tid, + foreach_func ( tid, True, "(msg.msg_iov)", (Addr)iov, msg->msg_iovlen * sizeof( struct vki_iovec ) ); for ( i = 0; i < msg->msg_iovlen; ++i, ++iov ) - foreach_func ( tid, + foreach_func ( tid, False, "(msg.msg_iov[i]", (Addr)iov->iov_base, iov->iov_len ); } if ( msg->msg_control ) - foreach_func ( tid, + foreach_func ( tid, False, "(msg.msg_control)", (Addr)msg->msg_control, msg->msg_controllen ); }