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
//----------------------------------------------------------------------