#include #include #include #include #include #include "../../memcheck.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; // Store correct values in aAddr but marking it undefined // so as to generate errors. We need to have deterministic // undefined values to have a reproducible test. aAddr.rc_family = VUI_AF_BLUETOOTH; aAddr.rc_bdaddr = *VUI_BDADDR_ANY; aAddr.rc_channel = 5; VALGRIND_MAKE_MEM_UNDEFINED(&aAddr, sizeof(aAddr)); // We re-assign below each piece one by one, so as to // have the piece marked initialised. // Ignore return values. // Everything uninit (family, ...) bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr)); // Same but with an unknown family (we hope :) aAddr.rc_family = 12345; // (reset everything to uninit) VALGRIND_MAKE_MEM_UNDEFINED(&aAddr, sizeof(aAddr)); bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr)); aAddr.rc_family = VUI_AF_BLUETOOTH; // uninit bdaddr and channel. bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr)); aAddr.rc_bdaddr = *VUI_BDADDR_ANY; // uninit channel. bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr)); aAddr.rc_channel = 5; // Everything correctly init. bind(nSocket, (struct sockaddr *) &aAddr, sizeof(aAddr)); return 0; }