Skip to content

Commit

Permalink
NFC: llcp: Clean local timers and works when removing a device
Browse files Browse the repository at this point in the history
Whenever an adapter is removed we must clean all the local structures,
especially the timers and scheduled work. Otherwise those asynchronous
threads will eventually try to access the freed nfc_dev pointer if an LLCP
link is up.

Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
  • Loading branch information
Samuel Ortiz committed Mar 8, 2013
1 parent b141e81 commit 3536da0
Showing 1 changed file with 14 additions and 7 deletions.
21 changes: 14 additions & 7 deletions net/nfc/llcp/llcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,20 +142,25 @@ struct nfc_llcp_local *nfc_llcp_local_get(struct nfc_llcp_local *local)
return local;
}

static void local_release(struct kref *ref)
static void local_cleanup(struct nfc_llcp_local *local, bool listen)
{
struct nfc_llcp_local *local;

local = container_of(ref, struct nfc_llcp_local, ref);

list_del(&local->list);
nfc_llcp_socket_release(local, false);
nfc_llcp_socket_release(local, listen);
del_timer_sync(&local->link_timer);
skb_queue_purge(&local->tx_queue);
cancel_work_sync(&local->tx_work);
cancel_work_sync(&local->rx_work);
cancel_work_sync(&local->timeout_work);
kfree_skb(local->rx_pending);
}

static void local_release(struct kref *ref)
{
struct nfc_llcp_local *local;

local = container_of(ref, struct nfc_llcp_local, ref);

list_del(&local->list);
local_cleanup(local, false);
kfree(local);
}

Expand Down Expand Up @@ -1427,6 +1432,8 @@ void nfc_llcp_unregister_device(struct nfc_dev *dev)
return;
}

local_cleanup(local, false);

nfc_llcp_local_put(local);
}

Expand Down

0 comments on commit 3536da0

Please sign in to comment.