<feed xmlns='http://www.w3.org/2005/Atom'>
<title>linux-stable.git/net, branch v3.4.12</title>
<subtitle>Linux kernel stable tree</subtitle>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/'/>
<entry>
<title>rds: set correct msg_namelen</title>
<updated>2012-10-02T17:30:35+00:00</updated>
<author>
<name>Weiping Pan</name>
<email>wpan@redhat.com</email>
</author>
<published>2012-07-23T02:37:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=b2c1fcae0409fec6d96351fe2793a502870f4370'/>
<id>b2c1fcae0409fec6d96351fe2793a502870f4370</id>
<content type='text'>
commit 06b6a1cf6e776426766298d055bb3991957d90a7 upstream.

Jay Fenlason (fenlason@redhat.com) found a bug,
that recvfrom() on an RDS socket can return the contents of random kernel
memory to userspace if it was called with a address length larger than
sizeof(struct sockaddr_in).
rds_recvmsg() also fails to set the addr_len paramater properly before
returning, but that's just a bug.
There are also a number of cases wher recvfrom() can return an entirely bogus
address. Anything in rds_recvmsg() that returns a non-negative value but does
not go through the "sin = (struct sockaddr_in *)msg-&gt;msg_name;" code path
at the end of the while(1) loop will return up to 128 bytes of kernel memory
to userspace.

And I write two test programs to reproduce this bug, you will see that in
rds_server, fromAddr will be overwritten and the following sock_fd will be
destroyed.
Yes, it is the programmer's fault to set msg_namelen incorrectly, but it is
better to make the kernel copy the real length of address to user space in
such case.

How to run the test programs ?
I test them on 32bit x86 system, 3.5.0-rc7.

1 compile
gcc -o rds_client rds_client.c
gcc -o rds_server rds_server.c

2 run ./rds_server on one console

3 run ./rds_client on another console

4 you will see something like:
server is waiting to receive data...
old socket fd=3
server received data from client:data from client
msg.msg_namelen=32
new socket fd=-1067277685
sendmsg()
: Bad file descriptor

/***************** rds_client.c ********************/

int main(void)
{
	int sock_fd;
	struct sockaddr_in serverAddr;
	struct sockaddr_in toAddr;
	char recvBuffer[128] = "data from client";
	struct msghdr msg;
	struct iovec iov;

	sock_fd = socket(AF_RDS, SOCK_SEQPACKET, 0);
	if (sock_fd &lt; 0) {
		perror("create socket error\n");
		exit(1);
	}

	memset(&amp;serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddr.sin_port = htons(4001);

	if (bind(sock_fd, (struct sockaddr*)&amp;serverAddr, sizeof(serverAddr)) &lt; 0) {
		perror("bind() error\n");
		close(sock_fd);
		exit(1);
	}

	memset(&amp;toAddr, 0, sizeof(toAddr));
	toAddr.sin_family = AF_INET;
	toAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	toAddr.sin_port = htons(4000);
	msg.msg_name = &amp;toAddr;
	msg.msg_namelen = sizeof(toAddr);
	msg.msg_iov = &amp;iov;
	msg.msg_iovlen = 1;
	msg.msg_iov-&gt;iov_base = recvBuffer;
	msg.msg_iov-&gt;iov_len = strlen(recvBuffer) + 1;
	msg.msg_control = 0;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;

	if (sendmsg(sock_fd, &amp;msg, 0) == -1) {
		perror("sendto() error\n");
		close(sock_fd);
		exit(1);
	}

	printf("client send data:%s\n", recvBuffer);

	memset(recvBuffer, '\0', 128);

	msg.msg_name = &amp;toAddr;
	msg.msg_namelen = sizeof(toAddr);
	msg.msg_iov = &amp;iov;
	msg.msg_iovlen = 1;
	msg.msg_iov-&gt;iov_base = recvBuffer;
	msg.msg_iov-&gt;iov_len = 128;
	msg.msg_control = 0;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;
	if (recvmsg(sock_fd, &amp;msg, 0) == -1) {
		perror("recvmsg() error\n");
		close(sock_fd);
		exit(1);
	}

	printf("receive data from server:%s\n", recvBuffer);

	close(sock_fd);

	return 0;
}

/***************** rds_server.c ********************/

int main(void)
{
	struct sockaddr_in fromAddr;
	int sock_fd;
	struct sockaddr_in serverAddr;
	unsigned int addrLen;
	char recvBuffer[128];
	struct msghdr msg;
	struct iovec iov;

	sock_fd = socket(AF_RDS, SOCK_SEQPACKET, 0);
	if(sock_fd &lt; 0) {
		perror("create socket error\n");
		exit(0);
	}

	memset(&amp;serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddr.sin_port = htons(4000);
	if (bind(sock_fd, (struct sockaddr*)&amp;serverAddr, sizeof(serverAddr)) &lt; 0) {
		perror("bind error\n");
		close(sock_fd);
		exit(1);
	}

	printf("server is waiting to receive data...\n");
	msg.msg_name = &amp;fromAddr;

	/*
	 * I add 16 to sizeof(fromAddr), ie 32,
	 * and pay attention to the definition of fromAddr,
	 * recvmsg() will overwrite sock_fd,
	 * since kernel will copy 32 bytes to userspace.
	 *
	 * If you just use sizeof(fromAddr), it works fine.
	 * */
	msg.msg_namelen = sizeof(fromAddr) + 16;
	/* msg.msg_namelen = sizeof(fromAddr); */
	msg.msg_iov = &amp;iov;
	msg.msg_iovlen = 1;
	msg.msg_iov-&gt;iov_base = recvBuffer;
	msg.msg_iov-&gt;iov_len = 128;
	msg.msg_control = 0;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;

	while (1) {
		printf("old socket fd=%d\n", sock_fd);
		if (recvmsg(sock_fd, &amp;msg, 0) == -1) {
			perror("recvmsg() error\n");
			close(sock_fd);
			exit(1);
		}
		printf("server received data from client:%s\n", recvBuffer);
		printf("msg.msg_namelen=%d\n", msg.msg_namelen);
		printf("new socket fd=%d\n", sock_fd);
		strcat(recvBuffer, "--data from server");
		if (sendmsg(sock_fd, &amp;msg, 0) == -1) {
			perror("sendmsg()\n");
			close(sock_fd);
			exit(1);
		}
	}

	close(sock_fd);
	return 0;
}

Signed-off-by: Weiping Pan &lt;wpan@redhat.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 06b6a1cf6e776426766298d055bb3991957d90a7 upstream.

Jay Fenlason (fenlason@redhat.com) found a bug,
that recvfrom() on an RDS socket can return the contents of random kernel
memory to userspace if it was called with a address length larger than
sizeof(struct sockaddr_in).
rds_recvmsg() also fails to set the addr_len paramater properly before
returning, but that's just a bug.
There are also a number of cases wher recvfrom() can return an entirely bogus
address. Anything in rds_recvmsg() that returns a non-negative value but does
not go through the "sin = (struct sockaddr_in *)msg-&gt;msg_name;" code path
at the end of the while(1) loop will return up to 128 bytes of kernel memory
to userspace.

And I write two test programs to reproduce this bug, you will see that in
rds_server, fromAddr will be overwritten and the following sock_fd will be
destroyed.
Yes, it is the programmer's fault to set msg_namelen incorrectly, but it is
better to make the kernel copy the real length of address to user space in
such case.

How to run the test programs ?
I test them on 32bit x86 system, 3.5.0-rc7.

1 compile
gcc -o rds_client rds_client.c
gcc -o rds_server rds_server.c

2 run ./rds_server on one console

3 run ./rds_client on another console

4 you will see something like:
server is waiting to receive data...
old socket fd=3
server received data from client:data from client
msg.msg_namelen=32
new socket fd=-1067277685
sendmsg()
: Bad file descriptor

/***************** rds_client.c ********************/

int main(void)
{
	int sock_fd;
	struct sockaddr_in serverAddr;
	struct sockaddr_in toAddr;
	char recvBuffer[128] = "data from client";
	struct msghdr msg;
	struct iovec iov;

	sock_fd = socket(AF_RDS, SOCK_SEQPACKET, 0);
	if (sock_fd &lt; 0) {
		perror("create socket error\n");
		exit(1);
	}

	memset(&amp;serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddr.sin_port = htons(4001);

	if (bind(sock_fd, (struct sockaddr*)&amp;serverAddr, sizeof(serverAddr)) &lt; 0) {
		perror("bind() error\n");
		close(sock_fd);
		exit(1);
	}

	memset(&amp;toAddr, 0, sizeof(toAddr));
	toAddr.sin_family = AF_INET;
	toAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	toAddr.sin_port = htons(4000);
	msg.msg_name = &amp;toAddr;
	msg.msg_namelen = sizeof(toAddr);
	msg.msg_iov = &amp;iov;
	msg.msg_iovlen = 1;
	msg.msg_iov-&gt;iov_base = recvBuffer;
	msg.msg_iov-&gt;iov_len = strlen(recvBuffer) + 1;
	msg.msg_control = 0;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;

	if (sendmsg(sock_fd, &amp;msg, 0) == -1) {
		perror("sendto() error\n");
		close(sock_fd);
		exit(1);
	}

	printf("client send data:%s\n", recvBuffer);

	memset(recvBuffer, '\0', 128);

	msg.msg_name = &amp;toAddr;
	msg.msg_namelen = sizeof(toAddr);
	msg.msg_iov = &amp;iov;
	msg.msg_iovlen = 1;
	msg.msg_iov-&gt;iov_base = recvBuffer;
	msg.msg_iov-&gt;iov_len = 128;
	msg.msg_control = 0;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;
	if (recvmsg(sock_fd, &amp;msg, 0) == -1) {
		perror("recvmsg() error\n");
		close(sock_fd);
		exit(1);
	}

	printf("receive data from server:%s\n", recvBuffer);

	close(sock_fd);

	return 0;
}

/***************** rds_server.c ********************/

int main(void)
{
	struct sockaddr_in fromAddr;
	int sock_fd;
	struct sockaddr_in serverAddr;
	unsigned int addrLen;
	char recvBuffer[128];
	struct msghdr msg;
	struct iovec iov;

	sock_fd = socket(AF_RDS, SOCK_SEQPACKET, 0);
	if(sock_fd &lt; 0) {
		perror("create socket error\n");
		exit(0);
	}

	memset(&amp;serverAddr, 0, sizeof(serverAddr));
	serverAddr.sin_family = AF_INET;
	serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
	serverAddr.sin_port = htons(4000);
	if (bind(sock_fd, (struct sockaddr*)&amp;serverAddr, sizeof(serverAddr)) &lt; 0) {
		perror("bind error\n");
		close(sock_fd);
		exit(1);
	}

	printf("server is waiting to receive data...\n");
	msg.msg_name = &amp;fromAddr;

	/*
	 * I add 16 to sizeof(fromAddr), ie 32,
	 * and pay attention to the definition of fromAddr,
	 * recvmsg() will overwrite sock_fd,
	 * since kernel will copy 32 bytes to userspace.
	 *
	 * If you just use sizeof(fromAddr), it works fine.
	 * */
	msg.msg_namelen = sizeof(fromAddr) + 16;
	/* msg.msg_namelen = sizeof(fromAddr); */
	msg.msg_iov = &amp;iov;
	msg.msg_iovlen = 1;
	msg.msg_iov-&gt;iov_base = recvBuffer;
	msg.msg_iov-&gt;iov_len = 128;
	msg.msg_control = 0;
	msg.msg_controllen = 0;
	msg.msg_flags = 0;

	while (1) {
		printf("old socket fd=%d\n", sock_fd);
		if (recvmsg(sock_fd, &amp;msg, 0) == -1) {
			perror("recvmsg() error\n");
			close(sock_fd);
			exit(1);
		}
		printf("server received data from client:%s\n", recvBuffer);
		printf("msg.msg_namelen=%d\n", msg.msg_namelen);
		printf("new socket fd=%d\n", sock_fd);
		strcat(recvBuffer, "--data from server");
		if (sendmsg(sock_fd, &amp;msg, 0) == -1) {
			perror("sendmsg()\n");
			close(sock_fd);
			exit(1);
		}
	}

	close(sock_fd);
	return 0;
}

Signed-off-by: Weiping Pan &lt;wpan@redhat.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>net: Statically initialize init_net.dev_base_head</title>
<updated>2012-10-02T17:30:35+00:00</updated>
<author>
<name>Rustad, Mark D</name>
<email>mark.d.rustad@intel.com</email>
</author>
<published>2012-07-18T09:06:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=e6da94be68b025bdbbee3764428769a85367aa79'/>
<id>e6da94be68b025bdbbee3764428769a85367aa79</id>
<content type='text'>
commit 734b65417b24d6eea3e3d7457e1f11493890ee1d upstream.

This change eliminates an initialization-order hazard most
recently seen when netprio_cgroup is built into the kernel.

With thanks to Eric Dumazet for catching a bug.

Signed-off-by: Mark Rustad &lt;mark.d.rustad@intel.com&gt;
Acked-by: Eric Dumazet &lt;edumazet@google.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 734b65417b24d6eea3e3d7457e1f11493890ee1d upstream.

This change eliminates an initialization-order hazard most
recently seen when netprio_cgroup is built into the kernel.

With thanks to Eric Dumazet for catching a bug.

Signed-off-by: Mark Rustad &lt;mark.d.rustad@intel.com&gt;
Acked-by: Eric Dumazet &lt;edumazet@google.com&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Bluetooth: Fix sending a HCI Authorization Request over LE links</title>
<updated>2012-10-02T17:30:34+00:00</updated>
<author>
<name>Vinicius Costa Gomes</name>
<email>vinicius.gomes@openbossa.org</email>
</author>
<published>2012-08-24T00:32:44+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=c031edca540afb66764db24eed10eb149ac6c852'/>
<id>c031edca540afb66764db24eed10eb149ac6c852</id>
<content type='text'>
commit d8343f125710fb596f7a88cd756679f14f4e77b9 upstream.

In the case that the link is already in the connected state and a
Pairing request arrives from the mgmt interface, hci_conn_security()
would be called but it was not considering LE links.

Reported-by: João Paulo Rechi Vita &lt;jprvita@openbossa.org&gt;
Signed-off-by: Vinicius Costa Gomes &lt;vinicius.gomes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit d8343f125710fb596f7a88cd756679f14f4e77b9 upstream.

In the case that the link is already in the connected state and a
Pairing request arrives from the mgmt interface, hci_conn_security()
would be called but it was not considering LE links.

Reported-by: João Paulo Rechi Vita &lt;jprvita@openbossa.org&gt;
Signed-off-by: Vinicius Costa Gomes &lt;vinicius.gomes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Bluetooth: Change signature of smp_conn_security()</title>
<updated>2012-10-02T17:30:34+00:00</updated>
<author>
<name>Vinicius Costa Gomes</name>
<email>vinicius.gomes@openbossa.org</email>
</author>
<published>2012-08-24T00:32:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=0fcc0805df9cf7483e927cf6a4dc94938318c06a'/>
<id>0fcc0805df9cf7483e927cf6a4dc94938318c06a</id>
<content type='text'>
commit cc110922da7e902b62d18641a370fec01a9fa794 upstream.

To make it clear that it may be called from contexts that may not have
any knowledge of L2CAP, we change the connection parameter, to receive
a hci_conn.

This also makes it clear that it is checking the security of the link.

Signed-off-by: Vinicius Costa Gomes &lt;vinicius.gomes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit cc110922da7e902b62d18641a370fec01a9fa794 upstream.

To make it clear that it may be called from contexts that may not have
any knowledge of L2CAP, we change the connection parameter, to receive
a hci_conn.

This also makes it clear that it is checking the security of the link.

Signed-off-by: Vinicius Costa Gomes &lt;vinicius.gomes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Bluetooth: Fix use-after-free bug in SMP</title>
<updated>2012-10-02T17:30:34+00:00</updated>
<author>
<name>Andre Guedes</name>
<email>andre.guedes@openbossa.org</email>
</author>
<published>2012-08-01T23:34:15+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=27d50469825fd267f44e13fb0627b011c0da6abd'/>
<id>27d50469825fd267f44e13fb0627b011c0da6abd</id>
<content type='text'>
commit 61a0cfb008f57ecf7eb28ee762952fb42dc15d15 upstream.

If SMP fails, we should always cancel security_timer delayed work.
Otherwise, security_timer function may run after l2cap_conn object
has been freed.

This patch fixes the following warning reported by ODEBUG:

WARNING: at lib/debugobjects.c:261 debug_print_object+0x7c/0x8d()
Hardware name: Bochs
ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x27
Modules linked in: btusb bluetooth
Pid: 440, comm: kworker/u:2 Not tainted 3.5.0-rc1+ #4
Call Trace:
 [&lt;ffffffff81174600&gt;] ? free_obj_work+0x4a/0x7f
 [&lt;ffffffff81023eb8&gt;] warn_slowpath_common+0x7e/0x97
 [&lt;ffffffff81023f65&gt;] warn_slowpath_fmt+0x41/0x43
 [&lt;ffffffff811746b1&gt;] debug_print_object+0x7c/0x8d
 [&lt;ffffffff810394f0&gt;] ? __queue_work+0x241/0x241
 [&lt;ffffffff81174fdd&gt;] debug_check_no_obj_freed+0x92/0x159
 [&lt;ffffffff810ac08e&gt;] slab_free_hook+0x6f/0x77
 [&lt;ffffffffa0019145&gt;] ? l2cap_conn_del+0x148/0x157 [bluetooth]
 [&lt;ffffffff810ae408&gt;] kfree+0x59/0xac
 [&lt;ffffffffa0019145&gt;] l2cap_conn_del+0x148/0x157 [bluetooth]
 [&lt;ffffffffa001b9a2&gt;] l2cap_recv_frame+0xa77/0xfa4 [bluetooth]
 [&lt;ffffffff810592f9&gt;] ? trace_hardirqs_on_caller+0x112/0x1ad
 [&lt;ffffffffa001c86c&gt;] l2cap_recv_acldata+0xe2/0x264 [bluetooth]
 [&lt;ffffffffa0002b2f&gt;] hci_rx_work+0x235/0x33c [bluetooth]
 [&lt;ffffffff81038dc3&gt;] ? process_one_work+0x126/0x2fe
 [&lt;ffffffff81038e22&gt;] process_one_work+0x185/0x2fe
 [&lt;ffffffff81038dc3&gt;] ? process_one_work+0x126/0x2fe
 [&lt;ffffffff81059f2e&gt;] ? lock_acquired+0x1b5/0x1cf
 [&lt;ffffffffa00028fa&gt;] ? le_scan_work+0x11d/0x11d [bluetooth]
 [&lt;ffffffff81036fb6&gt;] ? spin_lock_irq+0x9/0xb
 [&lt;ffffffff81039209&gt;] worker_thread+0xcf/0x175
 [&lt;ffffffff8103913a&gt;] ? rescuer_thread+0x175/0x175
 [&lt;ffffffff8103cfe0&gt;] kthread+0x95/0x9d
 [&lt;ffffffff812c5054&gt;] kernel_threadi_helper+0x4/0x10
 [&lt;ffffffff812c36b0&gt;] ? retint_restore_args+0x13/0x13
 [&lt;ffffffff8103cf4b&gt;] ? flush_kthread_worker+0xdb/0xdb
 [&lt;ffffffff812c5050&gt;] ? gs_change+0x13/0x13

This bug can be reproduced using hctool lecc or l2test tools and
bluetoothd not running.

Signed-off-by: Andre Guedes &lt;andre.guedes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 61a0cfb008f57ecf7eb28ee762952fb42dc15d15 upstream.

If SMP fails, we should always cancel security_timer delayed work.
Otherwise, security_timer function may run after l2cap_conn object
has been freed.

This patch fixes the following warning reported by ODEBUG:

WARNING: at lib/debugobjects.c:261 debug_print_object+0x7c/0x8d()
Hardware name: Bochs
ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x27
Modules linked in: btusb bluetooth
Pid: 440, comm: kworker/u:2 Not tainted 3.5.0-rc1+ #4
Call Trace:
 [&lt;ffffffff81174600&gt;] ? free_obj_work+0x4a/0x7f
 [&lt;ffffffff81023eb8&gt;] warn_slowpath_common+0x7e/0x97
 [&lt;ffffffff81023f65&gt;] warn_slowpath_fmt+0x41/0x43
 [&lt;ffffffff811746b1&gt;] debug_print_object+0x7c/0x8d
 [&lt;ffffffff810394f0&gt;] ? __queue_work+0x241/0x241
 [&lt;ffffffff81174fdd&gt;] debug_check_no_obj_freed+0x92/0x159
 [&lt;ffffffff810ac08e&gt;] slab_free_hook+0x6f/0x77
 [&lt;ffffffffa0019145&gt;] ? l2cap_conn_del+0x148/0x157 [bluetooth]
 [&lt;ffffffff810ae408&gt;] kfree+0x59/0xac
 [&lt;ffffffffa0019145&gt;] l2cap_conn_del+0x148/0x157 [bluetooth]
 [&lt;ffffffffa001b9a2&gt;] l2cap_recv_frame+0xa77/0xfa4 [bluetooth]
 [&lt;ffffffff810592f9&gt;] ? trace_hardirqs_on_caller+0x112/0x1ad
 [&lt;ffffffffa001c86c&gt;] l2cap_recv_acldata+0xe2/0x264 [bluetooth]
 [&lt;ffffffffa0002b2f&gt;] hci_rx_work+0x235/0x33c [bluetooth]
 [&lt;ffffffff81038dc3&gt;] ? process_one_work+0x126/0x2fe
 [&lt;ffffffff81038e22&gt;] process_one_work+0x185/0x2fe
 [&lt;ffffffff81038dc3&gt;] ? process_one_work+0x126/0x2fe
 [&lt;ffffffff81059f2e&gt;] ? lock_acquired+0x1b5/0x1cf
 [&lt;ffffffffa00028fa&gt;] ? le_scan_work+0x11d/0x11d [bluetooth]
 [&lt;ffffffff81036fb6&gt;] ? spin_lock_irq+0x9/0xb
 [&lt;ffffffff81039209&gt;] worker_thread+0xcf/0x175
 [&lt;ffffffff8103913a&gt;] ? rescuer_thread+0x175/0x175
 [&lt;ffffffff8103cfe0&gt;] kthread+0x95/0x9d
 [&lt;ffffffff812c5054&gt;] kernel_threadi_helper+0x4/0x10
 [&lt;ffffffff812c36b0&gt;] ? retint_restore_args+0x13/0x13
 [&lt;ffffffff8103cf4b&gt;] ? flush_kthread_worker+0xdb/0xdb
 [&lt;ffffffff812c5050&gt;] ? gs_change+0x13/0x13

This bug can be reproduced using hctool lecc or l2test tools and
bluetoothd not running.

Signed-off-by: Andre Guedes &lt;andre.guedes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>cfg80211: fix possible circular lock on reg_regdb_search()</title>
<updated>2012-10-02T17:30:09+00:00</updated>
<author>
<name>Luis R. Rodriguez</name>
<email>mcgrof@do-not-panic.com</email>
</author>
<published>2012-09-14T22:36:57+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=7334e402a35e0379933e8b0442f0baeed1104217'/>
<id>7334e402a35e0379933e8b0442f0baeed1104217</id>
<content type='text'>
commit a85d0d7f3460b1a123b78e7f7e39bf72c37dfb78 upstream.

When call_crda() is called we kick off a witch hunt search
for the same regulatory domain on our internal regulatory
database and that work gets kicked off on a workqueue, this
is done while the cfg80211_mutex is held. If that workqueue
kicks off it will first lock reg_regdb_search_mutex and
later cfg80211_mutex but to ensure two CPUs will not contend
against cfg80211_mutex the right thing to do is to have the
reg_regdb_search() wait until the cfg80211_mutex is let go.

The lockdep report is pasted below.

cfg80211: Calling CRDA to update world regulatory domain

======================================================
[ INFO: possible circular locking dependency detected ]
3.3.8 #3 Tainted: G           O
-------------------------------------------------------
kworker/0:1/235 is trying to acquire lock:
 (cfg80211_mutex){+.+...}, at: [&lt;816468a4&gt;] set_regdom+0x78c/0x808 [cfg80211]

but task is already holding lock:
 (reg_regdb_search_mutex){+.+...}, at: [&lt;81646828&gt;] set_regdom+0x710/0x808 [cfg80211]

which lock already depends on the new lock.

the existing dependency chain (in reverse order) is:

-&gt; #2 (reg_regdb_search_mutex){+.+...}:
       [&lt;800a8384&gt;] lock_acquire+0x60/0x88
       [&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
       [&lt;81645778&gt;] is_world_regdom+0x9f8/0xc74 [cfg80211]

-&gt; #1 (reg_mutex#2){+.+...}:
       [&lt;800a8384&gt;] lock_acquire+0x60/0x88
       [&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
       [&lt;8164539c&gt;] is_world_regdom+0x61c/0xc74 [cfg80211]

-&gt; #0 (cfg80211_mutex){+.+...}:
       [&lt;800a77b8&gt;] __lock_acquire+0x10d4/0x17bc
       [&lt;800a8384&gt;] lock_acquire+0x60/0x88
       [&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
       [&lt;816468a4&gt;] set_regdom+0x78c/0x808 [cfg80211]

other info that might help us debug this:

Chain exists of:
  cfg80211_mutex --&gt; reg_mutex#2 --&gt; reg_regdb_search_mutex

 Possible unsafe locking scenario:

       CPU0                    CPU1
       ----                    ----
  lock(reg_regdb_search_mutex);
                               lock(reg_mutex#2);
                               lock(reg_regdb_search_mutex);
  lock(cfg80211_mutex);

 *** DEADLOCK ***

3 locks held by kworker/0:1/235:
 #0:  (events){.+.+..}, at: [&lt;80089a00&gt;] process_one_work+0x230/0x460
 #1:  (reg_regdb_work){+.+...}, at: [&lt;80089a00&gt;] process_one_work+0x230/0x460
 #2:  (reg_regdb_search_mutex){+.+...}, at: [&lt;81646828&gt;] set_regdom+0x710/0x808 [cfg80211]

stack backtrace:
Call Trace:
[&lt;80290fd4&gt;] dump_stack+0x8/0x34
[&lt;80291bc4&gt;] print_circular_bug+0x2ac/0x2d8
[&lt;800a77b8&gt;] __lock_acquire+0x10d4/0x17bc
[&lt;800a8384&gt;] lock_acquire+0x60/0x88
[&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
[&lt;816468a4&gt;] set_regdom+0x78c/0x808 [cfg80211]

Reported-by: Felix Fietkau &lt;nbd@openwrt.org&gt;
Tested-by: Felix Fietkau &lt;nbd@openwrt.org&gt;
Signed-off-by: Luis R. Rodriguez &lt;mcgrof@do-not-panic.com&gt;
Reviewed-by: Johannes Berg &lt;johannes@sipsolutions.net&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit a85d0d7f3460b1a123b78e7f7e39bf72c37dfb78 upstream.

When call_crda() is called we kick off a witch hunt search
for the same regulatory domain on our internal regulatory
database and that work gets kicked off on a workqueue, this
is done while the cfg80211_mutex is held. If that workqueue
kicks off it will first lock reg_regdb_search_mutex and
later cfg80211_mutex but to ensure two CPUs will not contend
against cfg80211_mutex the right thing to do is to have the
reg_regdb_search() wait until the cfg80211_mutex is let go.

The lockdep report is pasted below.

cfg80211: Calling CRDA to update world regulatory domain

======================================================
[ INFO: possible circular locking dependency detected ]
3.3.8 #3 Tainted: G           O
-------------------------------------------------------
kworker/0:1/235 is trying to acquire lock:
 (cfg80211_mutex){+.+...}, at: [&lt;816468a4&gt;] set_regdom+0x78c/0x808 [cfg80211]

but task is already holding lock:
 (reg_regdb_search_mutex){+.+...}, at: [&lt;81646828&gt;] set_regdom+0x710/0x808 [cfg80211]

which lock already depends on the new lock.

the existing dependency chain (in reverse order) is:

-&gt; #2 (reg_regdb_search_mutex){+.+...}:
       [&lt;800a8384&gt;] lock_acquire+0x60/0x88
       [&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
       [&lt;81645778&gt;] is_world_regdom+0x9f8/0xc74 [cfg80211]

-&gt; #1 (reg_mutex#2){+.+...}:
       [&lt;800a8384&gt;] lock_acquire+0x60/0x88
       [&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
       [&lt;8164539c&gt;] is_world_regdom+0x61c/0xc74 [cfg80211]

-&gt; #0 (cfg80211_mutex){+.+...}:
       [&lt;800a77b8&gt;] __lock_acquire+0x10d4/0x17bc
       [&lt;800a8384&gt;] lock_acquire+0x60/0x88
       [&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
       [&lt;816468a4&gt;] set_regdom+0x78c/0x808 [cfg80211]

other info that might help us debug this:

Chain exists of:
  cfg80211_mutex --&gt; reg_mutex#2 --&gt; reg_regdb_search_mutex

 Possible unsafe locking scenario:

       CPU0                    CPU1
       ----                    ----
  lock(reg_regdb_search_mutex);
                               lock(reg_mutex#2);
                               lock(reg_regdb_search_mutex);
  lock(cfg80211_mutex);

 *** DEADLOCK ***

3 locks held by kworker/0:1/235:
 #0:  (events){.+.+..}, at: [&lt;80089a00&gt;] process_one_work+0x230/0x460
 #1:  (reg_regdb_work){+.+...}, at: [&lt;80089a00&gt;] process_one_work+0x230/0x460
 #2:  (reg_regdb_search_mutex){+.+...}, at: [&lt;81646828&gt;] set_regdom+0x710/0x808 [cfg80211]

stack backtrace:
Call Trace:
[&lt;80290fd4&gt;] dump_stack+0x8/0x34
[&lt;80291bc4&gt;] print_circular_bug+0x2ac/0x2d8
[&lt;800a77b8&gt;] __lock_acquire+0x10d4/0x17bc
[&lt;800a8384&gt;] lock_acquire+0x60/0x88
[&lt;802950a8&gt;] mutex_lock_nested+0x54/0x31c
[&lt;816468a4&gt;] set_regdom+0x78c/0x808 [cfg80211]

Reported-by: Felix Fietkau &lt;nbd@openwrt.org&gt;
Tested-by: Felix Fietkau &lt;nbd@openwrt.org&gt;
Signed-off-by: Luis R. Rodriguez &lt;mcgrof@do-not-panic.com&gt;
Reviewed-by: Johannes Berg &lt;johannes@sipsolutions.net&gt;
Signed-off-by: John W. Linville &lt;linville@tuxdriver.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Bluetooth: mgmt: Fix enabling LE while powered off</title>
<updated>2012-10-02T17:30:08+00:00</updated>
<author>
<name>Andrzej Kaczmarek</name>
<email>andrzej.kaczmarek@tieto.com</email>
</author>
<published>2012-08-29T08:02:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=a6be20b8cd1e5e847c4191b8f249b939aaabf987'/>
<id>a6be20b8cd1e5e847c4191b8f249b939aaabf987</id>
<content type='text'>
commit 562fcc246ebe31ade6e1be08585673b9b2785498 upstream.

When new BT USB adapter is plugged in it's configured while still being powered
off (HCI_AUTO_OFF flag is set), thus Set LE will only set dev_flags but won't
write changes to controller. As a result it's not possible to start device
discovery session on LE controller as it uses interleaved discovery which
requires LE Supported Host flag in extended features.

This patch ensures HCI Write LE Host Supported is sent when Set Powered is
called to power on controller and clear HCI_AUTO_OFF flag.

Signed-off-by: Andrzej Kaczmarek &lt;andrzej.kaczmarek@tieto.com&gt;
Acked-by: Johan Hedberg &lt;johan.hedberg@intel.com&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 562fcc246ebe31ade6e1be08585673b9b2785498 upstream.

When new BT USB adapter is plugged in it's configured while still being powered
off (HCI_AUTO_OFF flag is set), thus Set LE will only set dev_flags but won't
write changes to controller. As a result it's not possible to start device
discovery session on LE controller as it uses interleaved discovery which
requires LE Supported Host flag in extended features.

This patch ensures HCI Write LE Host Supported is sent when Set Powered is
called to power on controller and clear HCI_AUTO_OFF flag.

Signed-off-by: Andrzej Kaczmarek &lt;andrzej.kaczmarek@tieto.com&gt;
Acked-by: Johan Hedberg &lt;johan.hedberg@intel.com&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Bluetooth: Fix not removing power_off delayed work</title>
<updated>2012-10-02T17:30:08+00:00</updated>
<author>
<name>Vinicius Costa Gomes</name>
<email>vinicius.gomes@openbossa.org</email>
</author>
<published>2012-09-14T19:34:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=ec4d417c66a406bb464598220faf9f561d5b6d25'/>
<id>ec4d417c66a406bb464598220faf9f561d5b6d25</id>
<content type='text'>
commit 78c04c0bf52360dc2f7185e99c8e9aa05d73ae5a upstream.

For example, when a usb reset is received (I could reproduce it
running something very similar to this[1] in a loop) it could be
that the device is unregistered while the power_off delayed work
is still scheduled to run.

Backtrace:

WARNING: at lib/debugobjects.c:261 debug_print_object+0x7c/0x8d()
Hardware name: To Be Filled By O.E.M.
ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x26
Modules linked in: nouveau mxm_wmi btusb wmi bluetooth ttm coretemp drm_kms_helper
Pid: 2114, comm: usb-reset Not tainted 3.5.0bt-next #2
Call Trace:
 [&lt;ffffffff8124cc00&gt;] ? free_obj_work+0x57/0x91
 [&lt;ffffffff81058f88&gt;] warn_slowpath_common+0x7e/0x97
 [&lt;ffffffff81059035&gt;] warn_slowpath_fmt+0x41/0x43
 [&lt;ffffffff8124ccb6&gt;] debug_print_object+0x7c/0x8d
 [&lt;ffffffff8106e3ec&gt;] ? __queue_work+0x259/0x259
 [&lt;ffffffff8124d63e&gt;] ? debug_check_no_obj_freed+0x6f/0x1b5
 [&lt;ffffffff8124d667&gt;] debug_check_no_obj_freed+0x98/0x1b5
 [&lt;ffffffffa00aa031&gt;] ? bt_host_release+0x10/0x1e [bluetooth]
 [&lt;ffffffff810fc035&gt;] kfree+0x90/0xe6
 [&lt;ffffffffa00aa031&gt;] bt_host_release+0x10/0x1e [bluetooth]
 [&lt;ffffffff812ec2f9&gt;] device_release+0x4a/0x7e
 [&lt;ffffffff8123ef57&gt;] kobject_release+0x11d/0x154
 [&lt;ffffffff8123ed98&gt;] kobject_put+0x4a/0x4f
 [&lt;ffffffff812ec0d9&gt;] put_device+0x12/0x14
 [&lt;ffffffffa009472b&gt;] hci_free_dev+0x22/0x26 [bluetooth]
 [&lt;ffffffffa0280dd0&gt;] btusb_disconnect+0x96/0x9f [btusb]
 [&lt;ffffffff813581b4&gt;] usb_unbind_interface+0x57/0x106
 [&lt;ffffffff812ef988&gt;] __device_release_driver+0x83/0xd6
 [&lt;ffffffff812ef9fb&gt;] device_release_driver+0x20/0x2d
 [&lt;ffffffff813582a7&gt;] usb_driver_release_interface+0x44/0x7b
 [&lt;ffffffff81358795&gt;] usb_forced_unbind_intf+0x45/0x4e
 [&lt;ffffffff8134f959&gt;] usb_reset_device+0xa6/0x12e
 [&lt;ffffffff8135df86&gt;] usbdev_do_ioctl+0x319/0xe20
 [&lt;ffffffff81203244&gt;] ? avc_has_perm_flags+0xc9/0x12e
 [&lt;ffffffff812031a0&gt;] ? avc_has_perm_flags+0x25/0x12e
 [&lt;ffffffff81050101&gt;] ? do_page_fault+0x31e/0x3a1
 [&lt;ffffffff8135eaa6&gt;] usbdev_ioctl+0x9/0xd
 [&lt;ffffffff811126b1&gt;] vfs_ioctl+0x21/0x34
 [&lt;ffffffff81112f7b&gt;] do_vfs_ioctl+0x408/0x44b
 [&lt;ffffffff81208d45&gt;] ? file_has_perm+0x76/0x81
 [&lt;ffffffff8111300f&gt;] sys_ioctl+0x51/0x76
 [&lt;ffffffff8158db22&gt;] system_call_fastpath+0x16/0x1b

[1] http://cpansearch.perl.org/src/DPAVLIN/Biblio-RFID-0.03/examples/usbreset.c

Signed-off-by: Vinicius Costa Gomes &lt;vinicius.gomes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 78c04c0bf52360dc2f7185e99c8e9aa05d73ae5a upstream.

For example, when a usb reset is received (I could reproduce it
running something very similar to this[1] in a loop) it could be
that the device is unregistered while the power_off delayed work
is still scheduled to run.

Backtrace:

WARNING: at lib/debugobjects.c:261 debug_print_object+0x7c/0x8d()
Hardware name: To Be Filled By O.E.M.
ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x26
Modules linked in: nouveau mxm_wmi btusb wmi bluetooth ttm coretemp drm_kms_helper
Pid: 2114, comm: usb-reset Not tainted 3.5.0bt-next #2
Call Trace:
 [&lt;ffffffff8124cc00&gt;] ? free_obj_work+0x57/0x91
 [&lt;ffffffff81058f88&gt;] warn_slowpath_common+0x7e/0x97
 [&lt;ffffffff81059035&gt;] warn_slowpath_fmt+0x41/0x43
 [&lt;ffffffff8124ccb6&gt;] debug_print_object+0x7c/0x8d
 [&lt;ffffffff8106e3ec&gt;] ? __queue_work+0x259/0x259
 [&lt;ffffffff8124d63e&gt;] ? debug_check_no_obj_freed+0x6f/0x1b5
 [&lt;ffffffff8124d667&gt;] debug_check_no_obj_freed+0x98/0x1b5
 [&lt;ffffffffa00aa031&gt;] ? bt_host_release+0x10/0x1e [bluetooth]
 [&lt;ffffffff810fc035&gt;] kfree+0x90/0xe6
 [&lt;ffffffffa00aa031&gt;] bt_host_release+0x10/0x1e [bluetooth]
 [&lt;ffffffff812ec2f9&gt;] device_release+0x4a/0x7e
 [&lt;ffffffff8123ef57&gt;] kobject_release+0x11d/0x154
 [&lt;ffffffff8123ed98&gt;] kobject_put+0x4a/0x4f
 [&lt;ffffffff812ec0d9&gt;] put_device+0x12/0x14
 [&lt;ffffffffa009472b&gt;] hci_free_dev+0x22/0x26 [bluetooth]
 [&lt;ffffffffa0280dd0&gt;] btusb_disconnect+0x96/0x9f [btusb]
 [&lt;ffffffff813581b4&gt;] usb_unbind_interface+0x57/0x106
 [&lt;ffffffff812ef988&gt;] __device_release_driver+0x83/0xd6
 [&lt;ffffffff812ef9fb&gt;] device_release_driver+0x20/0x2d
 [&lt;ffffffff813582a7&gt;] usb_driver_release_interface+0x44/0x7b
 [&lt;ffffffff81358795&gt;] usb_forced_unbind_intf+0x45/0x4e
 [&lt;ffffffff8134f959&gt;] usb_reset_device+0xa6/0x12e
 [&lt;ffffffff8135df86&gt;] usbdev_do_ioctl+0x319/0xe20
 [&lt;ffffffff81203244&gt;] ? avc_has_perm_flags+0xc9/0x12e
 [&lt;ffffffff812031a0&gt;] ? avc_has_perm_flags+0x25/0x12e
 [&lt;ffffffff81050101&gt;] ? do_page_fault+0x31e/0x3a1
 [&lt;ffffffff8135eaa6&gt;] usbdev_ioctl+0x9/0xd
 [&lt;ffffffff811126b1&gt;] vfs_ioctl+0x21/0x34
 [&lt;ffffffff81112f7b&gt;] do_vfs_ioctl+0x408/0x44b
 [&lt;ffffffff81208d45&gt;] ? file_has_perm+0x76/0x81
 [&lt;ffffffff8111300f&gt;] sys_ioctl+0x51/0x76
 [&lt;ffffffff8158db22&gt;] system_call_fastpath+0x16/0x1b

[1] http://cpansearch.perl.org/src/DPAVLIN/Biblio-RFID-0.03/examples/usbreset.c

Signed-off-by: Vinicius Costa Gomes &lt;vinicius.gomes@openbossa.org&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>Bluetooth: mgmt: Fix enabling SSP while powered off</title>
<updated>2012-10-02T17:30:08+00:00</updated>
<author>
<name>Andrzej Kaczmarek</name>
<email>andrzej.kaczmarek@tieto.com</email>
</author>
<published>2012-08-29T08:02:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=dcc8dbc21ff2052c0df6dee3e1a36c3ef4f1133c'/>
<id>dcc8dbc21ff2052c0df6dee3e1a36c3ef4f1133c</id>
<content type='text'>
commit 3d1cbdd6aefff711bcf389fdabc4af9bc22e8201 upstream.

When new BT USB adapter is plugged in it's configured while still being powered
off (HCI_AUTO_OFF flag is set), thus Set SSP will only set dev_flags but won't
write changes to controller. As a result remote devices won't use Secure Simple
Pairing with our device due to SSP Host Support flag disabled in extended
features and may also reject SSP attempt from our side (with possible fallback
to legacy pairing).

This patch ensures HCI Write Simple Pairing Mode is sent when Set Powered is
called to power on controller and clear HCI_AUTO_OFF flag.

Signed-off-by: Andrzej Kaczmarek &lt;andrzej.kaczmarek@tieto.com&gt;
Acked-by: Johan Hedberg &lt;johan.hedberg@intel.com&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 3d1cbdd6aefff711bcf389fdabc4af9bc22e8201 upstream.

When new BT USB adapter is plugged in it's configured while still being powered
off (HCI_AUTO_OFF flag is set), thus Set SSP will only set dev_flags but won't
write changes to controller. As a result remote devices won't use Secure Simple
Pairing with our device due to SSP Host Support flag disabled in extended
features and may also reject SSP attempt from our side (with possible fallback
to legacy pairing).

This patch ensures HCI Write Simple Pairing Mode is sent when Set Powered is
called to power on controller and clear HCI_AUTO_OFF flag.

Signed-off-by: Andrzej Kaczmarek &lt;andrzej.kaczmarek@tieto.com&gt;
Acked-by: Johan Hedberg &lt;johan.hedberg@intel.com&gt;
Signed-off-by: Gustavo Padovan &lt;gustavo.padovan@collabora.co.uk&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
<entry>
<title>mac80211: clear bssid on auth/assoc failure</title>
<updated>2012-10-02T17:30:07+00:00</updated>
<author>
<name>Eliad Peller</name>
<email>eliad@wizery.com</email>
</author>
<published>2012-09-04T14:44:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.tavy.me/linux-stable.git/commit/?id=ba41a6df9e32ee5752165496017cadf700c14ca9'/>
<id>ba41a6df9e32ee5752165496017cadf700c14ca9</id>
<content type='text'>
commit 3d2abdfdf14f4d6decc2023708211e19b096f4ca upstream.

ifmgd-&gt;bssid wasn't cleared properly in some
auth/assoc failure cases, causing mac80211 and
the low-level driver to go out of sync.

Clear ifmgd-&gt;bssid on failure, and notify the driver.

Signed-off-by: Eliad Peller &lt;eliad@wizery.com&gt;
Signed-off-by: Johannes Berg &lt;johannes.berg@intel.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
commit 3d2abdfdf14f4d6decc2023708211e19b096f4ca upstream.

ifmgd-&gt;bssid wasn't cleared properly in some
auth/assoc failure cases, causing mac80211 and
the low-level driver to go out of sync.

Clear ifmgd-&gt;bssid on failure, and notify the driver.

Signed-off-by: Eliad Peller &lt;eliad@wizery.com&gt;
Signed-off-by: Johannes Berg &lt;johannes.berg@intel.com&gt;
Signed-off-by: Greg Kroah-Hartman &lt;gregkh@linuxfoundation.org&gt;

</pre>
</div>
</content>
</entry>
</feed>
