Package: valgrind Version: 1:3.10.1-4 Severity: normal Tags: patch --- Please enter the report below this line. ---
Hi. Wenn using socket syscalls (bind in my case) with address families not specially handled by valgrind (i.e. not AF_INET(6), AF_UNIX, AF_BLUETOOTH, AF_NETLINK), I get false positives for unitialized memory. The problem is, that for an unknown address-family the memory of the sockaddr struct is checked from AFTER the sa_family field for salen bytes, which then (correctly) finds uninitialized memory AFTER the actual struct. Either the memory has to be checked for salen - sizeof(sa_family) or the whole sockaddr struct has to be checked. These are the two ways to fix this (also attached as patches). I'd prefer way 1, since I see no reason not to check the sa_family field again, when it makes the code more readable. way 1: --- valgrind-3.10.1.orig/coregrind/m_syswrap/syswrap-generic.c +++ valgrind-3.10.1/coregrind/m_syswrap/syswrap-generic.c @@ -1126,7 +1126,7 @@ void pre_mem_read_sockaddr ( ThreadId ti Note that this can give false positive if this (unknown) struct sockaddr_???? has padding bytes between its elements. */ VG_(sprintf) ( outmsg, description, "sa_data" ); - PRE_MEM_READ( outmsg, (Addr)&sa->sa_family + sizeof(sa->sa_family), + PRE_MEM_READ( outmsg, (Addr)&sa->sa_family, salen ); break; } way 2: --- valgrind-3.10.1.orig/coregrind/m_syswrap/syswrap-generic.c +++ valgrind-3.10.1/coregrind/m_syswrap/syswrap-generic.c @@ -1127,7 +1127,7 @@ void pre_mem_read_sockaddr ( ThreadId ti struct sockaddr_???? has padding bytes between its elements. */ VG_(sprintf) ( outmsg, description, "sa_data" ); PRE_MEM_READ( outmsg, (Addr)&sa->sa_family + sizeof(sa->sa_family), - salen ); + salen - sizeof(sa->sa_family) ); break; } Regards Andre Naujoks --- System information. --- Architecture: amd64 Kernel: Linux 4.1.0-2-amd64 Debian Release: stretch/sid 500 unstable ftp.de.debian.org 500 stable dl.google.com --- Package information. --- Depends (Version) | Installed ========================-+-=========== libc6 (>= 2.16) | libc6-dbg | Recommends (Version) | Installed ===========================-+-=========== valgrind-dbg | 1:3.10.1-4 gdb | 7.10-1 Suggests (Version) | Installed ===========================-+-=========== valgrind-mpi | kcachegrind | alleyoop | valkyrie (>> 1.3.0) |
Index: valgrind-3.10.1/coregrind/m_syswrap/syswrap-generic.c =================================================================== --- valgrind-3.10.1.orig/coregrind/m_syswrap/syswrap-generic.c +++ valgrind-3.10.1/coregrind/m_syswrap/syswrap-generic.c @@ -1126,7 +1126,7 @@ void pre_mem_read_sockaddr ( ThreadId ti Note that this can give false positive if this (unknown) struct sockaddr_???? has padding bytes between its elements. */ VG_(sprintf) ( outmsg, description, "sa_data" ); - PRE_MEM_READ( outmsg, (Addr)&sa->sa_family + sizeof(sa->sa_family), + PRE_MEM_READ( outmsg, (Addr)&sa->sa_family, salen ); break; }
Index: valgrind-3.10.1/coregrind/m_syswrap/syswrap-generic.c =================================================================== --- valgrind-3.10.1.orig/coregrind/m_syswrap/syswrap-generic.c +++ valgrind-3.10.1/coregrind/m_syswrap/syswrap-generic.c @@ -1127,7 +1127,7 @@ void pre_mem_read_sockaddr ( ThreadId ti struct sockaddr_???? has padding bytes between its elements. */ VG_(sprintf) ( outmsg, description, "sa_data" ); PRE_MEM_READ( outmsg, (Addr)&sa->sa_family + sizeof(sa->sa_family), - salen ); + salen - sizeof(sa->sa_family) ); break; }