diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2015-04-01 16:51:52 -0400 |
---|---|---|
committer | Johan Hedberg <johan.hedberg@intel.com> | 2015-04-02 01:42:21 -0400 |
commit | 8bf17a3619250944957c732e71659787528131c3 (patch) | |
tree | 947aa3ed5b5975067446f1cc5f9b3f30de79e889 | |
parent | 41533fe5b4f92adb3c40f263b889dc6addff550e (diff) |
Bluetooth: Restrict CMTP flags to only valid ones
The CMTP flags should be clearly restricted to valid ones. So this puts
extra checks in place to ensure this.
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
-rw-r--r-- | net/bluetooth/cmtp/core.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c index 278a194e6af4..ddbc348c9dff 100644 --- a/net/bluetooth/cmtp/core.c +++ b/net/bluetooth/cmtp/core.c | |||
@@ -75,10 +75,11 @@ static void __cmtp_unlink_session(struct cmtp_session *session) | |||
75 | 75 | ||
76 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) | 76 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) |
77 | { | 77 | { |
78 | u32 valid_flags = BIT(CMTP_LOOPBACK); | ||
78 | memset(ci, 0, sizeof(*ci)); | 79 | memset(ci, 0, sizeof(*ci)); |
79 | bacpy(&ci->bdaddr, &session->bdaddr); | 80 | bacpy(&ci->bdaddr, &session->bdaddr); |
80 | 81 | ||
81 | ci->flags = session->flags; | 82 | ci->flags = session->flags & valid_flags; |
82 | ci->state = session->state; | 83 | ci->state = session->state; |
83 | 84 | ||
84 | ci->num = session->num; | 85 | ci->num = session->num; |
@@ -329,6 +330,7 @@ static int cmtp_session(void *arg) | |||
329 | 330 | ||
330 | int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | 331 | int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) |
331 | { | 332 | { |
333 | u32 valid_flags = BIT(CMTP_LOOPBACK); | ||
332 | struct cmtp_session *session, *s; | 334 | struct cmtp_session *session, *s; |
333 | int i, err; | 335 | int i, err; |
334 | 336 | ||
@@ -337,6 +339,9 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
337 | if (!l2cap_is_socket(sock)) | 339 | if (!l2cap_is_socket(sock)) |
338 | return -EBADFD; | 340 | return -EBADFD; |
339 | 341 | ||
342 | if (req->flags & ~valid_flags) | ||
343 | return -EINVAL; | ||
344 | |||
340 | session = kzalloc(sizeof(struct cmtp_session), GFP_KERNEL); | 345 | session = kzalloc(sizeof(struct cmtp_session), GFP_KERNEL); |
341 | if (!session) | 346 | if (!session) |
342 | return -ENOMEM; | 347 | return -ENOMEM; |
@@ -409,11 +414,15 @@ failed: | |||
409 | 414 | ||
410 | int cmtp_del_connection(struct cmtp_conndel_req *req) | 415 | int cmtp_del_connection(struct cmtp_conndel_req *req) |
411 | { | 416 | { |
417 | u32 valid_flags = 0; | ||
412 | struct cmtp_session *session; | 418 | struct cmtp_session *session; |
413 | int err = 0; | 419 | int err = 0; |
414 | 420 | ||
415 | BT_DBG(""); | 421 | BT_DBG(""); |
416 | 422 | ||
423 | if (req->flags & ~valid_flags) | ||
424 | return -EINVAL; | ||
425 | |||
417 | down_read(&cmtp_session_sem); | 426 | down_read(&cmtp_session_sem); |
418 | 427 | ||
419 | session = __cmtp_get_session(&req->bdaddr); | 428 | session = __cmtp_get_session(&req->bdaddr); |