]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
pre_mem_read_sockaddr: properly handle the NETLINK address family
authorJulian Seward <jseward@acm.org>
Wed, 6 Aug 2014 19:52:12 +0000 (19:52 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 6 Aug 2014 19:52:12 +0000 (19:52 +0000)
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

coregrind/m_syswrap/syswrap-generic.c
include/vki/vki-linux.h

index 35a2b4099f05ba8c1f69f7a4a03bf39da7081ee8..92da5092f2deedfdd251954ce7eff3cf9b093d39 100644 (file)
@@ -1021,9 +1021,12 @@ void pre_mem_read_sockaddr ( ThreadId tid,
    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 @@ void pre_mem_read_sockaddr ( ThreadId tid,
             (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.
index 316959303b1069fae454add08cb10ef4d951fa03..baa203654ef6f2b5bd9594ecb019c5ee1ad4be24 100644 (file)
@@ -682,9 +682,11 @@ __KINLINE struct vki_cmsghdr * vki_cmsg_nxthdr (struct vki_msghdr *__msg, struct
 
 #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 */
@@ -756,6 +758,17 @@ struct vki_sockaddr_un {
        char sun_path[VKI_UNIX_PATH_MAX];       /* pathname */
 };
 
+//----------------------------------------------------------------------
+// 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
 //----------------------------------------------------------------------