]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Support Linux kernel AF_BLUETOOTH for bind().
authorMark Wielaard <mark@klomp.org>
Wed, 22 May 2013 10:21:10 +0000 (10:21 +0000)
committerMark Wielaard <mark@klomp.org>
Wed, 22 May 2013 10:21:10 +0000 (10:21 +0000)
Bug #320116. sockaddr_rc might contain some padding which might not be
initialized. Explicitly check the sockaddr_rc fields are set. That also
produces better diagnostics about which field is unitialized.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13404

coregrind/m_syswrap/syswrap-generic.c
include/vki/vki-linux.h
memcheck/tests/linux/Makefile.am
memcheck/tests/linux/rfcomm.c [new file with mode: 0644]
memcheck/tests/linux/rfcomm.stderr.exp [new file with mode: 0644]
memcheck/tests/linux/rfcomm.vgtest [new file with mode: 0644]

index 40a4bbe4a5e787106b0422840f08096280148aea..3a6ea8224a0ff8abf611f696873917716ad177f7 100644 (file)
@@ -941,6 +941,7 @@ 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;
+   struct vki_sockaddr_rc*  rc   = (struct vki_sockaddr_rc *)sa;
 
    /* NULL/zero-length sockaddrs are legal */
    if ( sa == NULL || salen == 0 ) return;
@@ -981,6 +982,13 @@ void pre_mem_read_sockaddr ( ThreadId tid,
             (Addr) &sin6->sin6_scope_id, sizeof (sin6->sin6_scope_id) );
          break;
                
+      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;
+
       default:
          VG_(sprintf) ( outmsg, description, "" );
          PRE_MEM_READ( outmsg, (Addr) sa, salen );
index c57cabd934a69acc50f915b7cc39db4c96f783c9..08ab138260a501ce02bf2d4cd8158c88ec64f361 100644 (file)
@@ -676,6 +676,7 @@ __KINLINE struct vki_cmsghdr * vki_cmsg_nxthdr (struct vki_msghdr *__msg, struct
 #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_BLUETOOTH 31    /* Bluetooth sockets            */
 
 #define VKI_MSG_NOSIGNAL       0x4000  /* Do not generate SIGPIPE */
 
@@ -2967,6 +2968,16 @@ struct vki_hci_inquiry_req {
    __vki_u8  num_rsp;
 };
 
+//----------------------------------------------------------------------
+// From linux-3.9.2/include/net/bluetooth/rfcomm.h
+//----------------------------------------------------------------------
+
+struct vki_sockaddr_rc {
+        vki_sa_family_t     rc_family;
+        vki_bdaddr_t        rc_bdaddr;
+        __vki_u8            rc_channel;
+};
+
 //----------------------------------------------------------------------
 // From linux-3.4/include/linux/kvm.h
 //----------------------------------------------------------------------
index 4cc911358b96938a3bcf6e18ed7cb92730af48c8..9755f5c21cfce5392cfac2ca00f44bd3deb54e25 100644 (file)
@@ -8,6 +8,7 @@ EXTRA_DIST = \
        capget.vgtest capget.stderr.exp capget.stderr.exp2 \
        lsframe1.vgtest lsframe1.stdout.exp lsframe1.stderr.exp \
        lsframe2.vgtest lsframe2.stdout.exp lsframe2.stderr.exp \
+       rfcomm.vgtest rfcomm.stderr.exp \
        sigqueue.vgtest sigqueue.stderr.exp \
        stack_changes.stderr.exp stack_changes.stdout.exp \
            stack_changes.stdout.exp2 stack_changes.vgtest \
@@ -26,6 +27,7 @@ check_PROGRAMS = \
        getregset \
        lsframe1 \
        lsframe2 \
+       rfcomm \
        sigqueue \
        stack_changes \
        stack_switch \
diff --git a/memcheck/tests/linux/rfcomm.c b/memcheck/tests/linux/rfcomm.c
new file mode 100644 (file)
index 0000000..02dcd7e
--- /dev/null
@@ -0,0 +1,54 @@
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+
+/* user space headers might not be there, define things ourselves. */
+typedef struct {
+   uint8_t b[6];
+} __attribute__((packed)) vui_bdaddr_t;
+
+struct vui_sockaddr_rc {
+       sa_family_t     rc_family;
+       vui_bdaddr_t    rc_bdaddr;
+       uint8_t         rc_channel;
+};
+
+#define VUI_AF_BLUETOOTH 31
+#define VUI_BTPROTO_RFCOMM 3
+
+#define VUI_BDADDR_ANY (&(vui_bdaddr_t) {{0, 0, 0, 0, 0, 0}})
+
+int
+main (int argc, char **argv)
+{
+  int nSocket;
+
+  nSocket = socket(VUI_AF_BLUETOOTH, SOCK_STREAM, VUI_BTPROTO_RFCOMM);
+
+  if (nSocket < 0)
+    {
+      // Not supported, nothing to test...
+      return 1;
+    }
+
+  struct vui_sockaddr_rc aAddr;
+  // Ignore return values.
+
+  // Missing family
+  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
+
+  aAddr.rc_family = VUI_AF_BLUETOOTH;
+  // Missing bdaddr.
+  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
+
+  aAddr.rc_bdaddr = *VUI_BDADDR_ANY;
+  // Missing channel.
+  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
+
+  aAddr.rc_channel = 5;
+  bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
+
+  return 0;
+}
diff --git a/memcheck/tests/linux/rfcomm.stderr.exp b/memcheck/tests/linux/rfcomm.stderr.exp
new file mode 100644 (file)
index 0000000..4df935b
--- /dev/null
@@ -0,0 +1,21 @@
+Syscall param socketcall.bind(my_addr.sa_family) points to uninitialised byte(s)
+   ...
+   by 0x........: main (rfcomm.c:40)
+ Address 0x........ is on thread 1's stack
+ Uninitialised value was created by a stack allocation
+   at 0x........: main (rfcomm.c:25)
+
+Syscall param socketcall.bind(my_addr.rc_bdaddr) points to uninitialised byte(s)
+   ...
+   by 0x........: main (rfcomm.c:44)
+ Address 0x........ is on thread 1's stack
+ Uninitialised value was created by a stack allocation
+   at 0x........: main (rfcomm.c:25)
+
+Syscall param socketcall.bind(my_addr.rc_channel) points to uninitialised byte(s)
+   ...
+   by 0x........: main (rfcomm.c:48)
+ Address 0x........ is on thread 1's stack
+ Uninitialised value was created by a stack allocation
+   at 0x........: main (rfcomm.c:25)
+
diff --git a/memcheck/tests/linux/rfcomm.vgtest b/memcheck/tests/linux/rfcomm.vgtest
new file mode 100644 (file)
index 0000000..490aef4
--- /dev/null
@@ -0,0 +1,5 @@
+prog: rfcomm
+vgopts: -q --track-origins=yes
+
+# Will exit -1 if AF_BLUETOOTH not supported
+prereq: ./rfcomm