pre_mem_read_sockaddr: properly handle the NETLINK address family
rather than throwing to the default case.  This stops Memcheck
reporting false positives for the NETLINK case.



git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14237 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c
index 35a2b40..92da509 100644
--- a/coregrind/m_syswrap/syswrap-generic.c
+++ b/coregrind/m_syswrap/syswrap-generic.c
@@ -1021,9 +1021,12 @@
    struct vki_sockaddr_un*  sun  = (struct vki_sockaddr_un *)sa;
    struct vki_sockaddr_in*  sin  = (struct vki_sockaddr_in *)sa;
    struct vki_sockaddr_in6* sin6 = (struct vki_sockaddr_in6 *)sa;
-#ifdef VKI_AF_BLUETOOTH
+#  ifdef VKI_AF_BLUETOOTH
    struct vki_sockaddr_rc*  rc   = (struct vki_sockaddr_rc *)sa;
-#endif
+#  endif
+#  ifdef VKI_AF_NETLINK
+   struct vki_sockaddr_nl*  nl   = (struct vki_sockaddr_nl *)sa;
+#  endif
 
    /* NULL/zero-length sockaddrs are legal */
    if ( sa == NULL || salen == 0 ) return;
@@ -1064,14 +1067,23 @@
             (Addr) &sin6->sin6_scope_id, sizeof (sin6->sin6_scope_id) );
          break;
 
-#ifdef VKI_AF_BLUETOOTH
+#     ifdef VKI_AF_BLUETOOTH
       case VKI_AF_BLUETOOTH:
          VG_(sprintf) ( outmsg, description, "rc_bdaddr" );
          PRE_MEM_READ( outmsg, (Addr) &rc->rc_bdaddr, sizeof (rc->rc_bdaddr) );
          VG_(sprintf) ( outmsg, description, "rc_channel" );
          PRE_MEM_READ( outmsg, (Addr) &rc->rc_channel, sizeof (rc->rc_channel) );
          break;
-#endif
+#     endif
+
+#     ifdef VKI_AF_NETLINK
+      case VKI_AF_NETLINK:
+         VG_(sprintf)(outmsg, description, "nl_pid");
+         PRE_MEM_READ(outmsg, (Addr)&nl->nl_pid, sizeof(nl->nl_pid));
+         VG_(sprintf)(outmsg, description, "nl_groups");
+         PRE_MEM_READ(outmsg, (Addr)&nl->nl_groups, sizeof(nl->nl_groups));
+         break;
+#     endif
 
       default:
          /* No specific information about this address family.
diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h
index 3169593..baa2036 100644
--- a/include/vki/vki-linux.h
+++ b/include/vki/vki-linux.h
@@ -682,9 +682,11 @@
 
 #define	VKI_SCM_RIGHTS	0x01		/* rw: access rights (array of int) */
 
+#define VKI_AF_UNSPEC   0
 #define VKI_AF_UNIX	1	/* Unix domain sockets 		*/
 #define VKI_AF_INET	2	/* Internet IP Protocol		*/
 #define VKI_AF_INET6	10	/* IP version 6			*/
+#define VKI_AF_NETLINK  16
 #define VKI_AF_BLUETOOTH 31	/* Bluetooth sockets		*/
 
 #define VKI_MSG_NOSIGNAL	0x4000	/* Do not generate SIGPIPE */
@@ -757,6 +759,17 @@
 };
 
 //----------------------------------------------------------------------
+// From linux-3.15.8/include/uapi/linux/netlink.h
+//----------------------------------------------------------------------
+
+struct vki_sockaddr_nl {
+        vki_sa_family_t    nl_family;      /* AF_NETLINK   */
+        unsigned short     nl_pad;         /* zero         */
+        __vki_u32          nl_pid;         /* port ID      */
+        __vki_u32          nl_groups;      /* multicast groups mask */
+};
+
+//----------------------------------------------------------------------
 // From linux-2.6.8.1/include/linux/if.h
 //----------------------------------------------------------------------