projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
4ba5175
)
Bluetooth: hci_ldisc: Free rw_semaphore on close
author
Hermes Zhang
<chenhuiz@axis.com>
Tue, 28 Aug 2018 01:48:30 +0000
(09:48 +0800)
committer
Marcel Holtmann
<marcel@holtmann.org>
Tue, 11 Sep 2018 11:33:57 +0000
(13:33 +0200)
The percpu_rw_semaphore is not currently freed, and this leads to
a crash when the stale rcu callback is invoked. DEBUG_OBJECTS
detects this.
ODEBUG: free active (active state 1) object type: rcu_head hint: (null)
------------[ cut here ]------------
WARNING: CPU: 1 PID: 2024 at debug_print_object+0xac/0xc8
PC is at debug_print_object+0xac/0xc8
LR is at debug_print_object+0xac/0xc8
Call trace:
[<
ffffff80082e2c2c
>] debug_print_object+0xac/0xc8
[<
ffffff80082e40b0
>] debug_check_no_obj_freed+0x1e8/0x228
[<
ffffff8008191254
>] kfree+0x1cc/0x250
[<
ffffff80083cc03c
>] hci_uart_tty_close+0x54/0x108
[<
ffffff800832e118
>] tty_ldisc_close.isra.1+0x40/0x58
[<
ffffff800832e14c
>] tty_ldisc_kill+0x1c/0x40
[<
ffffff800832e3dc
>] tty_ldisc_release+0x94/0x170
[<
ffffff8008325554
>] tty_release_struct+0x1c/0x58
[<
ffffff8008326400
>] tty_release+0x3b0/0x490
[<
ffffff80081a3fe8
>] __fput+0x88/0x1d0
[<
ffffff80081a418c
>] ____fput+0xc/0x18
[<
ffffff80080c0624
>] task_work_run+0x9c/0xc0
[<
ffffff80080a9e24
>] do_exit+0x24c/0x8a0
[<
ffffff80080aa4e0
>] do_group_exit+0x38/0xa0
[<
ffffff80080aa558
>] __wake_up_parent+0x0/0x28
[<
ffffff8008082c00
>] el0_svc_naked+0x34/0x38
---[ end trace
bfe08cbd89098cdf
]---
Signed-off-by: Hermes Zhang <chenhuiz@axis.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/hci_ldisc.c
patch
|
blob
|
history
diff --git
a/drivers/bluetooth/hci_ldisc.c
b/drivers/bluetooth/hci_ldisc.c
index 963bb0309e25d34a44382bc3a8e9e0556cca72d1..ea6238ed5c0eaa095ada2c2b0f88aea27707dcbf 100644
(file)
--- a/
drivers/bluetooth/hci_ldisc.c
+++ b/
drivers/bluetooth/hci_ldisc.c
@@
-543,6
+543,8
@@
static void hci_uart_tty_close(struct tty_struct *tty)
}
clear_bit(HCI_UART_PROTO_SET, &hu->flags);
+ percpu_free_rwsem(&hu->proto_lock);
+
kfree(hu);
}