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;
(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 );
#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 */
__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
//----------------------------------------------------------------------
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 \
getregset \
lsframe1 \
lsframe2 \
+ rfcomm \
sigqueue \
stack_changes \
stack_switch \
--- /dev/null
+#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;
+}
--- /dev/null
+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)
+
--- /dev/null
+prog: rfcomm
+vgopts: -q --track-origins=yes
+
+# Will exit -1 if AF_BLUETOOTH not supported
+prereq: ./rfcomm