Hi Dave,
> > > > > How do you produce these oopses, because I've never seen them.
> > > > http://people.redhat.com/davej/sfuzz.c
> > > > (it ran for a few hours before it caused the oopses)
> > >
> > > Any options to make it appear faster?
> >
> > I just ran it with no arguments.
>
> I was able to reproduce the hci_sock_getname() oops, but I have actually
> no idea how we can have a NULL pointer dereference in that code. Need to
> find a way to reproduce this faster. Took me at least 20 minutes before
> the oops appeared.
after modifying Ilja's tool, I was capable of reproducing these oopses
very fast, but it took me some time to understand why both are ending up
in a NULL pointer dereference. However here is a patch for them. The
sfuzz on AF_BLUETOOTH only is now running for over half an hour without
any oops. I will send this upstream as soon as possible.
Regards
Marcel
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index bdb6458..97bdec7 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -143,13 +143,15 @@ void hci_send_to_sock(struct hci_dev *hd
static int hci_sock_release(struct socket *sock)
{
struct sock *sk = sock->sk;
- struct hci_dev *hdev = hci_pi(sk)->hdev;
+ struct hci_dev *hdev;
BT_DBG("sock %p sk %p", sock, sk);
if (!sk)
return 0;
+ hdev = hci_pi(sk)->hdev;
+
bt_sock_unlink(&hci_sk_list, sk);
if (hdev) {
@@ -311,14 +313,18 @@ static int hci_sock_getname(struct socke
{
struct sockaddr_hci *haddr = (struct sockaddr_hci *) addr;
struct sock *sk = sock->sk;
+ struct hci_dev *hdev = hci_pi(sk)->hdev;
BT_DBG("sock %p sk %p", sock, sk);
+ if (!hdev)
+ return -EBADFD;
+
lock_sock(sk);
*addr_len = sizeof(*haddr);
haddr->hci_family = AF_BLUETOOTH;
- haddr->hci_dev = hci_pi(sk)->hdev->id;
+ haddr->hci_dev = hdev->id;
release_sock(sk);
return 0;