Skip to content

Commit f023ac4

Browse files
Carlos Llamaswinzkh
authored andcommitted
FROMGIT: binder: fix double-free in dbitmap
A process might fail to allocate a new bitmap when trying to expand its proc->dmap. In that case, dbitmap_grow() fails and frees the old bitmap via dbitmap_free(). However, the driver calls dbitmap_free() again when the same process terminates, leading to a double-free error: ================================================================== BUG: KASAN: double-free in binder_proc_dec_tmpref+0x2e0/0x55c Free of addr ffff00000b7c1420 by task kworker/9:1/209 CPU: 9 UID: 0 PID: 209 Comm: kworker/9:1 Not tainted 6.17.0-rc6-dirty #5 PREEMPT Hardware name: linux,dummy-virt (DT) Workqueue: events binder_deferred_func Call trace: kfree+0x164/0x31c binder_proc_dec_tmpref+0x2e0/0x55c binder_deferred_func+0xc24/0x1120 process_one_work+0x520/0xba4 [...] Allocated by task 448: __kmalloc_noprof+0x178/0x3c0 bitmap_zalloc+0x24/0x30 binder_open+0x14c/0xc10 [...] Freed by task 449: kfree+0x184/0x31c binder_inc_ref_for_node+0xb44/0xe44 binder_transaction+0x29b4/0x7fbc binder_thread_write+0x1708/0x442c binder_ioctl+0x1b50/0x2900 [...] ================================================================== Fix this issue by marking proc->map NULL in dbitmap_free(). Cc: [email protected] Fixes: 15d9da3f818c ("binder: use bitmap for faster descriptor lookup") Signed-off-by: Carlos Llamas <[email protected]> Reviewed-by: Alice Ryhl <[email protected]> Reviewed-by: Tiffany Yang <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]> Bug: 445046756 (cherry picked from commit 3ebcd3460cad351f198c39c6edb4af519a0ed934 git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git char-misc-next) Change-Id: I94bc33928927253bebd567d5f55e924a11e6db64 Signed-off-by: Carlos Llamas <[email protected]>
1 parent b510ef2 commit f023ac4

File tree

1 file changed

+1
-0
lines changed

1 file changed

+1
-0
lines changed

drivers/android/dbitmap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ static inline void dbitmap_free(struct dbitmap *dmap)
3737
{
3838
dmap->nbits = 0;
3939
kfree(dmap->map);
40+
dmap->map = NULL;
4041
}
4142

4243
/* Returns the nbits that a dbitmap can shrink to, 0 if not possible. */

0 commit comments

Comments
 (0)