Skip to content

Commit

Permalink
[BLUETOOTH]: rfcomm tty BUG_ON() code fix
Browse files Browse the repository at this point in the history
1) In tty.c the BUG_ON at line 115 will never be called, because the the
   before list_del_init in this same function.
	115          BUG_ON(!list_empty(&dev->list));
   So move the list_del_init to rfcomm_dev_del 

2) The rfcomm_dev_del could be called from diffrent path
   (rfcomm_tty_hangup/rfcomm_dev_state_change/rfcomm_release_dev),

   So add another BUG_ON when the rfcomm_dev_del is called more than
   one time.

Signed-off-by: Dave Young <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
hidave authored and davem330 committed Jan 11, 2008
1 parent ecd2ebd commit f951375
Showing 1 changed file with 13 additions and 9 deletions.
22 changes: 13 additions & 9 deletions net/bluetooth/rfcomm/tty.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev)

BT_DBG("dev %p dlc %p", dev, dlc);

write_lock_bh(&rfcomm_dev_lock);
list_del_init(&dev->list);
write_unlock_bh(&rfcomm_dev_lock);
/* Refcount should only hit zero when called from rfcomm_dev_del()
which will have taken us off the list. Everything else are
refcounting bugs. */
BUG_ON(!list_empty(&dev->list));

rfcomm_dlc_lock(dlc);
/* Detach DLC if it's owned by this dev */
Expand All @@ -109,11 +110,6 @@ static void rfcomm_dev_destruct(struct rfcomm_dev *dev)

tty_unregister_device(rfcomm_tty_driver, dev->id);

/* Refcount should only hit zero when called from rfcomm_dev_del()
which will have taken us off the list. Everything else are
refcounting bugs. */
BUG_ON(!list_empty(&dev->list));

kfree(dev);

/* It's safe to call module_put() here because socket still
Expand Down Expand Up @@ -313,7 +309,15 @@ static void rfcomm_dev_del(struct rfcomm_dev *dev)
{
BT_DBG("dev %p", dev);

set_bit(RFCOMM_TTY_RELEASED, &dev->flags);
if (test_bit(RFCOMM_TTY_RELEASED, &dev->flags))
BUG_ON(1);
else
set_bit(RFCOMM_TTY_RELEASED, &dev->flags);

write_lock_bh(&rfcomm_dev_lock);
list_del_init(&dev->list);
write_unlock_bh(&rfcomm_dev_lock);

rfcomm_dev_put(dev);
}

Expand Down

0 comments on commit f951375

Please sign in to comment.