1 #include <stdint.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <sys/types.h>
5 #include <sys/socket.h>
6 #include "../../memcheck.h"
7 
8 /* user space headers might not be there, define things ourselves. */
9 typedef struct {
10    uint8_t b[6];
11 } __attribute__((packed)) vui_bdaddr_t;
12 
13 struct vui_sockaddr_rc {
14 	sa_family_t	rc_family;
15 	vui_bdaddr_t	rc_bdaddr;
16 	uint8_t		rc_channel;
17 };
18 
19 #define VUI_AF_BLUETOOTH 31
20 #define VUI_BTPROTO_RFCOMM 3
21 
22 #define VUI_BDADDR_ANY (&(vui_bdaddr_t) {{0, 0, 0, 0, 0, 0}})
23 
24 int
main(int argc,char ** argv)25 main (int argc, char **argv)
26 {
27   int nSocket;
28 
29   nSocket = socket(VUI_AF_BLUETOOTH, SOCK_STREAM, VUI_BTPROTO_RFCOMM);
30 
31   if (nSocket < 0)
32     {
33       // Not supported, nothing to test...
34       return 1;
35     }
36 
37   struct vui_sockaddr_rc aAddr;
38 
39   // Store correct values in aAddr but marking it undefined
40   // so as to generate errors. We need to have deterministic
41   // undefined values to have a reproducible test.
42   aAddr.rc_family = VUI_AF_BLUETOOTH;
43   aAddr.rc_bdaddr = *VUI_BDADDR_ANY;
44   aAddr.rc_channel = 5;
45   VALGRIND_MAKE_MEM_UNDEFINED(&aAddr, sizeof(aAddr));
46   // We re-assign below each piece one by one, so as to
47   // have the piece marked initialised.
48 
49 
50   // Ignore return values.
51 
52   // Everything uninit (family, ...)
53   bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
54 
55   // Same but with an unknown family (we hope :)
56   aAddr.rc_family = 12345;
57   // (reset everything to uninit)
58   VALGRIND_MAKE_MEM_UNDEFINED(&aAddr, sizeof(aAddr));
59   bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
60 
61   aAddr.rc_family = VUI_AF_BLUETOOTH;
62   // uninit bdaddr and channel.
63   bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
64 
65   aAddr.rc_bdaddr = *VUI_BDADDR_ANY;
66   // uninit channel.
67   bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
68 
69   aAddr.rc_channel = 5;
70   // Everything correctly init.
71   bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr));
72 
73   return 0;
74 }
75