diff options
Diffstat (limited to 'net/bluetooth/hidp/core.c')
| -rw-r--r-- | net/bluetooth/hidp/core.c | 19 | 
1 files changed, 9 insertions, 10 deletions
diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c index 43b4c2deb7c..fb68f344c34 100644 --- a/net/bluetooth/hidp/core.c +++ b/net/bluetooth/hidp/core.c @@ -764,6 +764,7 @@ static int hidp_session(void *arg)  	up_write(&hidp_session_sem); +	kfree(session->rd_data);  	kfree(session);  	return 0;  } @@ -841,7 +842,8 @@ static int hidp_setup_input(struct hidp_session *session,  	err = input_register_device(input);  	if (err < 0) { -		hci_conn_put_device(session->conn); +		input_free_device(input); +		session->input = NULL;  		return err;  	} @@ -1044,8 +1046,12 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock,  	}  	err = hid_add_device(session->hid); -	if (err < 0) -		goto err_add_device; +	if (err < 0) { +		atomic_inc(&session->terminate); +		wake_up_process(session->task); +		up_write(&hidp_session_sem); +		return err; +	}  	if (session->input) {  		hidp_send_ctrl_message(session, @@ -1059,12 +1065,6 @@ int hidp_add_connection(struct hidp_connadd_req *req, struct socket *ctrl_sock,  	up_write(&hidp_session_sem);  	return 0; -err_add_device: -	hid_destroy_device(session->hid); -	session->hid = NULL; -	atomic_inc(&session->terminate); -	wake_up_process(session->task); -  unlink:  	hidp_del_timer(session); @@ -1090,7 +1090,6 @@ purge:  failed:  	up_write(&hidp_session_sem); -	input_free_device(session->input);  	kfree(session);  	return err;  }  |