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;
    }
    

Reply via email to