diff options
Diffstat (limited to 'drivers/android/binder.c')
| -rw-r--r-- | drivers/android/binder.c | 9 | 
1 files changed, 9 insertions, 0 deletions
| diff --git a/drivers/android/binder.c b/drivers/android/binder.c index a6b2082c24f8..e47c8a4c83db 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -5228,6 +5228,7 @@ static int binder_open(struct inode *nodp, struct file *filp)  		binder_dev = container_of(filp->private_data,  					  struct binder_device, miscdev);  	} +	refcount_inc(&binder_dev->ref);  	proc->context = &binder_dev->context;  	binder_alloc_init(&proc->alloc); @@ -5405,6 +5406,7 @@ static int binder_node_release(struct binder_node *node, int refs)  static void binder_deferred_release(struct binder_proc *proc)  {  	struct binder_context *context = proc->context; +	struct binder_device *device;  	struct rb_node *n;  	int threads, nodes, incoming_refs, outgoing_refs, active_transactions; @@ -5421,6 +5423,12 @@ static void binder_deferred_release(struct binder_proc *proc)  		context->binder_context_mgr_node = NULL;  	}  	mutex_unlock(&context->context_mgr_node_lock); +	device = container_of(proc->context, struct binder_device, context); +	if (refcount_dec_and_test(&device->ref)) { +		kfree(context->name); +		kfree(device); +	} +	proc->context = NULL;  	binder_inner_proc_lock(proc);  	/*  	 * Make sure proc stays alive after we @@ -6077,6 +6085,7 @@ static int __init init_binder_device(const char *name)  	binder_device->miscdev.minor = MISC_DYNAMIC_MINOR;  	binder_device->miscdev.name = name; +	refcount_set(&binder_device->ref, 1);  	binder_device->context.binder_context_mgr_uid = INVALID_UID;  	binder_device->context.name = name;  	mutex_init(&binder_device->context.context_mgr_node_lock); |