diff --git a/valgrind-3.8.1-af-bluetooth.patch b/valgrind-3.8.1-af-bluetooth.patch new file mode 100644 index 0000000..d4dbde7 --- /dev/null +++ b/valgrind-3.8.1-af-bluetooth.patch @@ -0,0 +1,288 @@ +commit ada5ad79e5d8ecf47838319a46ea4671079e6291 +Author: mjw +Date: Wed May 22 10:21:10 2013 +0000 + + Support Linux kernel AF_BLUETOOTH for bind(). + + 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 a5019735-40e9-0310-863c-91ae7b9d1cf9 + +diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c +index 40a4bbe..3a6ea82 100644 +--- a/coregrind/m_syswrap/syswrap-generic.c ++++ b/coregrind/m_syswrap/syswrap-generic.c +@@ -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 ); +diff --git a/include/vki/vki-linux.h b/include/vki/vki-linux.h +index c57cabd..08ab138 100644 +--- a/include/vki/vki-linux.h ++++ b/include/vki/vki-linux.h +@@ -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 */ + +@@ -2968,6 +2969,16 @@ struct vki_hci_inquiry_req { + }; + + //---------------------------------------------------------------------- ++// 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 + //---------------------------------------------------------------------- + #define KVMIO 0xAE +diff --git a/memcheck/tests/linux/Makefile.am b/memcheck/tests/linux/Makefile.am +index 4cc9113..9755f5c 100644 +--- a/memcheck/tests/linux/Makefile.am ++++ b/memcheck/tests/linux/Makefile.am +@@ -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 +index 0000000..02dcd7e +--- /dev/null ++++ b/memcheck/tests/linux/rfcomm.c +@@ -0,0 +1,54 @@ ++#include ++#include ++#include ++#include ++#include ++ ++/* 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 +index 0000000..4df935b +--- /dev/null ++++ b/memcheck/tests/linux/rfcomm.stderr.exp +@@ -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 +index 0000000..490aef4 +--- /dev/null ++++ b/memcheck/tests/linux/rfcomm.vgtest +@@ -0,0 +1,5 @@ ++prog: rfcomm ++vgopts: -q --track-origins=yes ++ ++# Will exit -1 if AF_BLUETOOTH not supported ++prereq: ./rfcomm + +commit 4cb663fdaa2a63efc447f7251270446c4e8c9611 +Author: mjw +Date: Wed May 22 10:37:52 2013 +0000 + + Don't break platforms without AF_BLUETOOTH. + + git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13405 a5019735-40e9-0310-863c-91ae7b9d1cf9 + +diff --git a/coregrind/m_syswrap/syswrap-generic.c b/coregrind/m_syswrap/syswrap-generic.c +index 3a6ea82..b85fd9c 100644 +--- a/coregrind/m_syswrap/syswrap-generic.c ++++ b/coregrind/m_syswrap/syswrap-generic.c +@@ -941,7 +941,9 @@ 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 + struct vki_sockaddr_rc* rc = (struct vki_sockaddr_rc *)sa; ++#endif + + /* NULL/zero-length sockaddrs are legal */ + if ( sa == NULL || salen == 0 ) return; +@@ -981,13 +983,15 @@ void pre_mem_read_sockaddr ( ThreadId tid, + PRE_MEM_READ( outmsg, + (Addr) &sin6->sin6_scope_id, sizeof (sin6->sin6_scope_id) ); + break; +- ++ ++#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 + + default: + VG_(sprintf) ( outmsg, description, "" ); +--- valgrind-3.8.1.orig/memcheck/tests/linux/Makefile.in 2013-07-08 15:15:20.579962577 +0200 ++++ valgrind-3.8.1/memcheck/tests/linux/Makefile.in 2013-07-08 16:12:36.353352626 +0200 +@@ -55,8 +55,8 @@ + @VGCONF_HAVE_PLATFORM_SEC_TRUE@ -DVGP_SEC_@VGCONF_ARCH_PRI@_@VGCONF_OS@=1 + + check_PROGRAMS = brk$(EXEEXT) capget$(EXEEXT) getregset$(EXEEXT) \ +- lsframe1$(EXEEXT) lsframe2$(EXEEXT) sigqueue$(EXEEXT) \ +- stack_changes$(EXEEXT) stack_switch$(EXEEXT) \ ++ lsframe1$(EXEEXT) lsframe2$(EXEEXT) rfcomm$(EXEEXT) \ ++ sigqueue$(EXEEXT) stack_changes$(EXEEXT) stack_switch$(EXEEXT) \ + syscalls-2007$(EXEEXT) syslog-syscall$(EXEEXT) \ + timerfd-syscall$(EXEEXT) proc-auxv$(EXEEXT) + subdir = memcheck/tests/linux +@@ -86,6 +86,9 @@ + proc_auxv_SOURCES = proc-auxv.c + proc_auxv_OBJECTS = proc-auxv.$(OBJEXT) + proc_auxv_LDADD = $(LDADD) ++rfcomm_SOURCES = rfcomm.c ++rfcomm_OBJECTS = rfcomm.$(OBJEXT) ++rfcomm_LDADD = $(LDADD) + sigqueue_SOURCES = sigqueue.c + sigqueue_OBJECTS = sigqueue.$(OBJEXT) + sigqueue_LDADD = $(LDADD) +@@ -114,10 +117,10 @@ + CCLD = $(CC) + LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + SOURCES = brk.c capget.c getregset.c lsframe1.c lsframe2.c proc-auxv.c \ +- sigqueue.c stack_changes.c stack_switch.c syscalls-2007.c \ +- syslog-syscall.c timerfd-syscall.c ++ rfcomm.c sigqueue.c stack_changes.c stack_switch.c \ ++ syscalls-2007.c syslog-syscall.c timerfd-syscall.c + DIST_SOURCES = brk.c capget.c getregset.c lsframe1.c lsframe2.c \ +- proc-auxv.c sigqueue.c stack_changes.c stack_switch.c \ ++ proc-auxv.c rfcomm.c sigqueue.c stack_changes.c stack_switch.c \ + syscalls-2007.c syslog-syscall.c timerfd-syscall.c + ETAGS = etags + CTAGS = ctags +@@ -405,6 +408,7 @@ + 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 \ +@@ -473,6 +477,9 @@ + proc-auxv$(EXEEXT): $(proc_auxv_OBJECTS) $(proc_auxv_DEPENDENCIES) + @rm -f proc-auxv$(EXEEXT) + $(LINK) $(proc_auxv_OBJECTS) $(proc_auxv_LDADD) $(LIBS) ++rfcomm$(EXEEXT): $(rfcomm_OBJECTS) $(rfcomm_DEPENDENCIES) ++ @rm -f rfcomm$(EXEEXT) ++ $(LINK) $(rfcomm_OBJECTS) $(rfcomm_LDADD) $(LIBS) + sigqueue$(EXEEXT): $(sigqueue_OBJECTS) $(sigqueue_DEPENDENCIES) + @rm -f sigqueue$(EXEEXT) + $(LINK) $(sigqueue_OBJECTS) $(sigqueue_LDADD) $(LIBS) +@@ -504,6 +511,7 @@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lsframe1.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lsframe2.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proc-auxv.Po@am__quote@ ++@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rfcomm.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sigqueue.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack_changes.Po@am__quote@ + @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stack_switch.Po@am__quote@ diff --git a/valgrind.spec b/valgrind.spec index 1e26ceb..4431cb8 100644 --- a/valgrind.spec +++ b/valgrind.spec @@ -172,6 +172,9 @@ Patch43: valgrind-3.8.1-new-manpages.patch # KDE#320063 Support PTRACE_GET/SET_THREAD_AREA on x86. Patch44: valgrind-3.8.1-ptrace-thread-area.patch +# KDE#320116 Support Linux kernel AF_BLUETOOTH for bind() +Patch45: valgrind-3.8.1-af-bluetooth.patch + %ifarch x86_64 ppc64 # Ensure glibc{,-devel} is installed for both multilib arches BuildRequires: /lib/libc.so.6 /usr/lib/libc.so /lib64/libc.so.6 /usr/lib64/libc.so @@ -315,6 +318,7 @@ touch ./memcheck/tests/linux/getregset.stderr.exp %patch42 -p1 %patch43 -p1 %patch44 -p1 +%patch45 -p1 # These tests go into an endless loop on ARM # There is a __sync_add_and_fetch in the testcase. @@ -482,6 +486,7 @@ echo ===============END TESTING=============== - Add valgrind-3.8.1-ppc-setxattr.patch - Add valgrind-3.8.1-new-manpages.patch - Add valgrind-3.8.1-ptrace-thread-area.patch +- Add valgrind-3.8.1-af-bluetooth.patch * Tue May 28 2013 Michael Schwendt - 1:3.8.1-16 - Provide virtual -static package in -devel subpackage (#609624).