diff options
author | Samuel Ortiz <sameo@linux.intel.com> | 2012-10-29 09:02:17 -0400 |
---|---|---|
committer | Samuel Ortiz <sameo@linux.intel.com> | 2012-11-19 17:57:00 -0500 |
commit | 6e950fd214645e71e94bce2429bea58b88e1b5d0 (patch) | |
tree | 81169b2a40c2e6a5a64f728c77aad68bfd75ac04 /net/nfc | |
parent | 08eaa1e0ce5bad11bedd311a9ddc3baf778ee1df (diff) |
NFC: Copy user space buffer when sending UI frames
Using the userspace IO vector directly is wrong, we should copy it from
user space first.
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>
Diffstat (limited to 'net/nfc')
-rw-r--r-- | net/nfc/llcp/commands.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/net/nfc/llcp/commands.c b/net/nfc/llcp/commands.c index ed2d17312d61..f0a39456f26b 100644 --- a/net/nfc/llcp/commands.c +++ b/net/nfc/llcp/commands.c | |||
@@ -579,7 +579,7 @@ int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap, | |||
579 | struct sk_buff *pdu; | 579 | struct sk_buff *pdu; |
580 | struct nfc_llcp_local *local; | 580 | struct nfc_llcp_local *local; |
581 | size_t frag_len = 0, remaining_len; | 581 | size_t frag_len = 0, remaining_len; |
582 | u8 *msg_ptr; | 582 | u8 *msg_ptr, *msg_data; |
583 | int err; | 583 | int err; |
584 | 584 | ||
585 | pr_debug("Send UI frame len %zd\n", len); | 585 | pr_debug("Send UI frame len %zd\n", len); |
@@ -588,8 +588,17 @@ int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap, | |||
588 | if (local == NULL) | 588 | if (local == NULL) |
589 | return -ENODEV; | 589 | return -ENODEV; |
590 | 590 | ||
591 | msg_data = kzalloc(len, GFP_KERNEL); | ||
592 | if (msg_data == NULL) | ||
593 | return -ENOMEM; | ||
594 | |||
595 | if (memcpy_fromiovec(msg_data, msg->msg_iov, len)) { | ||
596 | kfree(msg_data); | ||
597 | return -EFAULT; | ||
598 | } | ||
599 | |||
591 | remaining_len = len; | 600 | remaining_len = len; |
592 | msg_ptr = (u8 *) msg->msg_iov; | 601 | msg_ptr = msg_data; |
593 | 602 | ||
594 | while (remaining_len > 0) { | 603 | while (remaining_len > 0) { |
595 | 604 | ||
@@ -616,6 +625,8 @@ int nfc_llcp_send_ui_frame(struct nfc_llcp_sock *sock, u8 ssap, u8 dsap, | |||
616 | msg_ptr += frag_len; | 625 | msg_ptr += frag_len; |
617 | } | 626 | } |
618 | 627 | ||
628 | kfree(msg_data); | ||
629 | |||
619 | return len; | 630 | return len; |
620 | } | 631 | } |
621 | 632 | ||