commit fc75e5ea3e57d58bbbbd3fd8fff3a71de9a1b172 Author: tom Date: Thu Feb 28 12:50:55 2013 +0000 Don't check the flags word in msghdr for sendmsg as the kernel will neither read nor write it. Patch from Mark Wielaard to fix BZ#315441. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13294 a5019735-40e9-0310-863c-91ae7b9d1cf9 diff --git a/memcheck/tests/filter_stderr b/memcheck/tests/filter_stderr index abd6792..3d62d94 100755 --- a/memcheck/tests/filter_stderr +++ b/memcheck/tests/filter_stderr @@ -22,6 +22,9 @@ sed "s/checked [0-9,]* bytes./checked ... bytes./" | # records. So we filter out the loss record numbers. perl -p -e "s/in loss record \d+ of \d+/in loss record ... of .../" | +# Filter out glibc debuginfo if installed. +perl -p -e "s/\(syscall-template.S:[0-9]*\)/(in \/...libc...)/" | + $dir/../../memcheck/tests/filter_memcheck "$@" exit 0 diff --git a/memcheck/tests/sendmsg.c b/memcheck/tests/sendmsg.c new file mode 100644 index 0000000..2039f07 --- /dev/null +++ b/memcheck/tests/sendmsg.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include +#include +#include + +#define PORT 12345 + +int +main (int argc, char **argv) +{ + int fd; + struct sockaddr_in sa; + struct msghdr msg; + struct iovec iov[2]; + + fd = socket (AF_INET, SOCK_DGRAM, 0); + if (fd == -1) + { + perror ("socket()"); + exit (EXIT_FAILURE); + } + + sa.sin_family = AF_INET; + sa.sin_addr.s_addr = htonl (INADDR_LOOPBACK); + sa.sin_port = htons (PORT); + if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1) + { + perror ("connect ()"); + exit (EXIT_FAILURE); + } + + // Create msg_hdr. Oops, we forget to set msg_name... + msg.msg_namelen = 0; + iov[0].iov_base = "one"; + iov[0].iov_len = 3; + iov[1].iov_base = "two"; + iov[1].iov_len = 3; + msg.msg_iov = &iov; + msg.msg_iovlen = 2; + msg.msg_control = NULL; + msg.msg_controllen = 0; + + size_t s = sendmsg (fd, &msg, 0); + + // Note how we now do set msg_name, but don't set msg_flags. + // The msg_flags field is ignored by sendmsg. + msg.msg_name = NULL; + + fd = socket (AF_INET, SOCK_DGRAM, 0); + if (fd == -1) + { + perror ("socket()"); + exit (EXIT_FAILURE); + } + + if (connect (fd, (struct sockaddr *) &sa, sizeof (sa)) == -1) + { + perror ("connect ()"); + exit (EXIT_FAILURE); + } + + s = sendmsg (fd, &msg, 0); + if (s == -1) + { + perror ("sendmsg ()"); + exit (EXIT_FAILURE); + } + else + fprintf (stderr, "sendmsg: %d\n", (int) s); + + exit(0); +} diff --git a/memcheck/tests/sendmsg.stderr.exp b/memcheck/tests/sendmsg.stderr.exp new file mode 100644 index 0000000..38e20c5 --- /dev/null +++ b/memcheck/tests/sendmsg.stderr.exp @@ -0,0 +1,6 @@ +Syscall param sendmsg(msg) points to uninitialised byte(s) + at 0x........: sendmsg (in /...libc...) + by 0x........: main (sendmsg.c:45) + Address 0x........ is on thread 1's stack + +sendmsg: 6 diff --git a/memcheck/tests/sendmsg.vgtest b/memcheck/tests/sendmsg.vgtest new file mode 100644 index 0000000..f252b62 --- /dev/null +++ b/memcheck/tests/sendmsg.vgtest @@ -0,0 +1,2 @@ +prog: sendmsg +vgopts: -q --- valgrind-3.8.1/memcheck/tests/Makefile.in.orig 2013-02-19 14:46:14.305186272 +0100 +++ valgrind-3.8.1/memcheck/tests/Makefile.in 2013-02-19 14:59:41.284835217 +0100 @@ -105,20 +105,20 @@ partial_load$(EXEEXT) pdb-realloc$(EXEEXT) \ pdb-realloc2$(EXEEXT) pipe$(EXEEXT) pointer-trace$(EXEEXT) \ post-syscall$(EXEEXT) realloc1$(EXEEXT) realloc2$(EXEEXT) \ - realloc3$(EXEEXT) sbfragment$(EXEEXT) sh-mem$(EXEEXT) \ - sh-mem-random$(EXEEXT) sigaltstack$(EXEEXT) signal2$(EXEEXT) \ - sigprocmask$(EXEEXT) static_malloc$(EXEEXT) sigkill$(EXEEXT) \ - stpncpy$(EXEEXT) strchr$(EXEEXT) str_tester$(EXEEXT) \ - supp_unknown$(EXEEXT) supp1$(EXEEXT) supp2$(EXEEXT) \ - suppfree$(EXEEXT) test-plo$(EXEEXT) trivialleak$(EXEEXT) \ - unit_libcbase$(EXEEXT) unit_oset$(EXEEXT) varinfo1$(EXEEXT) \ - varinfo2$(EXEEXT) varinfo3$(EXEEXT) varinfo4$(EXEEXT) \ - varinfo5$(EXEEXT) varinfo5so.so$(EXEEXT) varinfo6$(EXEEXT) \ - vcpu_fbench$(EXEEXT) vcpu_fnfns$(EXEEXT) wcs$(EXEEXT) \ - xml1$(EXEEXT) wrap1$(EXEEXT) wrap2$(EXEEXT) wrap3$(EXEEXT) \ - wrap4$(EXEEXT) wrap5$(EXEEXT) wrap6$(EXEEXT) wrap7$(EXEEXT) \ - wrap7so.so$(EXEEXT) wrap8$(EXEEXT) writev1$(EXEEXT) \ - $(am__EXEEXT_1) + realloc3$(EXEEXT) sbfragment$(EXEEXT) sendmsg$(EXEEXT) \ + sh-mem$(EXEEXT) sh-mem-random$(EXEEXT) sigaltstack$(EXEEXT) \ + signal2$(EXEEXT) sigprocmask$(EXEEXT) static_malloc$(EXEEXT) \ + sigkill$(EXEEXT) stpncpy$(EXEEXT) strchr$(EXEEXT) \ + str_tester$(EXEEXT) supp_unknown$(EXEEXT) supp1$(EXEEXT) \ + supp2$(EXEEXT) suppfree$(EXEEXT) test-plo$(EXEEXT) \ + trivialleak$(EXEEXT) unit_libcbase$(EXEEXT) unit_oset$(EXEEXT) \ + varinfo1$(EXEEXT) varinfo2$(EXEEXT) varinfo3$(EXEEXT) \ + varinfo4$(EXEEXT) varinfo5$(EXEEXT) varinfo5so.so$(EXEEXT) \ + varinfo6$(EXEEXT) vcpu_fbench$(EXEEXT) vcpu_fnfns$(EXEEXT) \ + wcs$(EXEEXT) xml1$(EXEEXT) wrap1$(EXEEXT) wrap2$(EXEEXT) \ + wrap3$(EXEEXT) wrap4$(EXEEXT) wrap5$(EXEEXT) wrap6$(EXEEXT) \ + wrap7$(EXEEXT) wrap7so.so$(EXEEXT) wrap8$(EXEEXT) \ + writev1$(EXEEXT) $(am__EXEEXT_1) @DWARF4_TRUE@am__append_12 = dw4 subdir = memcheck/tests ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -434,6 +434,9 @@ sbfragment_SOURCES = sbfragment.c sbfragment_OBJECTS = sbfragment.$(OBJEXT) sbfragment_LDADD = $(LDADD) +sendmsg_SOURCES = sendmsg.c +sendmsg_OBJECTS = sendmsg.$(OBJEXT) +sendmsg_LDADD = $(LDADD) sh_mem_SOURCES = sh-mem.c sh_mem_OBJECTS = sh-mem.$(OBJEXT) sh_mem_LDADD = $(LDADD) @@ -610,8 +613,8 @@ origin3-no.c origin4-many.c origin5-bz2.c origin6-fp.c \ overlap.c partial_load.c partiallydefinedeq.c pdb-realloc.c \ pdb-realloc2.c pipe.c pointer-trace.c post-syscall.c \ - realloc1.c realloc2.c realloc3.c sbfragment.c sh-mem.c \ - sh-mem-random.c sigaltstack.c sigkill.c signal2.c \ + realloc1.c realloc2.c realloc3.c sbfragment.c sendmsg.c \ + sh-mem.c sh-mem-random.c sigaltstack.c sigkill.c signal2.c \ sigprocmask.c static_malloc.c stpncpy.c str_tester.c strchr.c \ $(supp1_SOURCES) $(supp2_SOURCES) $(supp_unknown_SOURCES) \ suppfree.c test-plo.c trivialleak.c unit_libcbase.c \ @@ -641,8 +644,8 @@ origin3-no.c origin4-many.c origin5-bz2.c origin6-fp.c \ overlap.c partial_load.c partiallydefinedeq.c pdb-realloc.c \ pdb-realloc2.c pipe.c pointer-trace.c post-syscall.c \ - realloc1.c realloc2.c realloc3.c sbfragment.c sh-mem.c \ - sh-mem-random.c sigaltstack.c sigkill.c signal2.c \ + realloc1.c realloc2.c realloc3.c sbfragment.c sendmsg.c \ + sh-mem.c sh-mem-random.c sigaltstack.c sigkill.c signal2.c \ sigprocmask.c static_malloc.c stpncpy.c str_tester.c strchr.c \ $(supp1_SOURCES) $(supp2_SOURCES) $(supp_unknown_SOURCES) \ suppfree.c test-plo.c trivialleak.c unit_libcbase.c \ @@ -1112,6 +1115,7 @@ realloc2.stderr.exp realloc2.vgtest \ realloc3.stderr.exp realloc3.vgtest \ sbfragment.stdout.exp sbfragment.stderr.exp sbfragment.vgtest \ + sendmsg.stderr.exp sendmsg.vgtest \ sh-mem.stderr.exp sh-mem.vgtest \ sh-mem-random.stderr.exp sh-mem-random.stdout.exp64 \ sh-mem-random.stdout.exp sh-mem-random.vgtest \ @@ -1560,6 +1564,9 @@ sbfragment$(EXEEXT): $(sbfragment_OBJECTS) $(sbfragment_DEPENDENCIES) @rm -f sbfragment$(EXEEXT) $(LINK) $(sbfragment_OBJECTS) $(sbfragment_LDADD) $(LIBS) +sendmsg$(EXEEXT): $(sendmsg_OBJECTS) $(sendmsg_DEPENDENCIES) + @rm -f sendmsg$(EXEEXT) + $(LINK) $(sendmsg_OBJECTS) $(sendmsg_LDADD) $(LIBS) sh-mem$(EXEEXT): $(sh_mem_OBJECTS) $(sh_mem_DEPENDENCIES) @rm -f sh-mem$(EXEEXT) $(LINK) $(sh_mem_OBJECTS) $(sh_mem_LDADD) $(LIBS) @@ -1775,6 +1782,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/realloc2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/realloc3.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sbfragment.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sendmsg.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sh-mem-random.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sh-mem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigaltstack.Po@am__quote@ --- a/coregrind/m_syswrap/syswrap-generic.c.orig 2013-02-28 15:14:08.035441439 +0100 +++ b/coregrind/m_syswrap/syswrap-generic.c 2013-02-28 15:18:13.035249059 +0100 @@ -848,7 +848,8 @@ Char *name, struct vki_msghdr *msg, UInt length, - void (*foreach_func)( ThreadId, Bool, Char *, Addr, SizeT ) + void (*foreach_func)( ThreadId, Bool, Char *, Addr, SizeT ), + Bool recv ) { Char *fieldName; @@ -866,7 +867,11 @@ foreach_func ( tid, True, fieldName, (Addr)&msg->msg_iovlen, sizeof( msg->msg_iovlen ) ); foreach_func ( tid, True, fieldName, (Addr)&msg->msg_control, sizeof( msg->msg_control ) ); foreach_func ( tid, True, fieldName, (Addr)&msg->msg_controllen, sizeof( msg->msg_controllen ) ); - foreach_func ( tid, False, fieldName, (Addr)&msg->msg_flags, sizeof( msg->msg_flags ) ); + + /* msg_flags is completely ignored for send_mesg, recv_mesg doesn't read + the field, but does write to it. */ + if ( recv ) + foreach_func ( tid, False, fieldName, (Addr)&msg->msg_flags, sizeof( msg->msg_flags ) ); if ( msg->msg_name ) { VG_(sprintf) ( fieldName, "(%s.msg_name)", name ); @@ -1509,7 +1514,7 @@ void ML_(generic_PRE_sys_sendmsg) ( ThreadId tid, Char *name, struct vki_msghdr *msg ) { - msghdr_foreachfield ( tid, name, msg, ~0, pre_mem_read_sendmsg ); + msghdr_foreachfield ( tid, name, msg, ~0, pre_mem_read_sendmsg, False ); } /* ------ */ @@ -1517,13 +1522,13 @@ void ML_(generic_PRE_sys_recvmsg) ( ThreadId tid, Char *name, struct vki_msghdr *msg ) { - msghdr_foreachfield ( tid, name, msg, ~0, pre_mem_write_recvmsg ); + msghdr_foreachfield ( tid, name, msg, ~0, pre_mem_write_recvmsg, True ); } void ML_(generic_POST_sys_recvmsg) ( ThreadId tid, Char *name, struct vki_msghdr *msg, UInt length ) { - msghdr_foreachfield( tid, name, msg, length, post_mem_write_recvmsg ); + msghdr_foreachfield( tid, name, msg, length, post_mem_write_recvmsg, True ); check_cmsg_for_fds( tid, msg ); } --- a/memcheck/tests/Makefile.am.orig 2013-02-28 15:14:08.220442048 +0100 +++ b/memcheck/tests/Makefile.am 2013-02-28 15:20:17.575659460 +0100 @@ -179,6 +179,7 @@ realloc2.stderr.exp realloc2.vgtest \ realloc3.stderr.exp realloc3.vgtest \ sbfragment.stdout.exp sbfragment.stderr.exp sbfragment.vgtest \ + sendmsg.stderr.exp sendmsg.vgtest \ sh-mem.stderr.exp sh-mem.vgtest \ sh-mem-random.stderr.exp sh-mem-random.stdout.exp64 \ sh-mem-random.stdout.exp sh-mem-random.vgtest \ @@ -282,6 +283,7 @@ post-syscall \ realloc1 realloc2 realloc3 \ sbfragment \ + sendmsg \ sh-mem sh-mem-random \ sigaltstack signal2 sigprocmask static_malloc sigkill \ stpncpy \