aboutsummaryrefslogtreecommitdiffstats
path: root/net/nfc/rawsock.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/nfc/rawsock.c')
-rw-r--r--net/nfc/rawsock.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c
index 52de84a55115..ee7b2b365ef2 100644
--- a/net/nfc/rawsock.c
+++ b/net/nfc/rawsock.c
@@ -23,6 +23,7 @@
23 23
24#include <net/tcp_states.h> 24#include <net/tcp_states.h>
25#include <linux/nfc.h> 25#include <linux/nfc.h>
26#include <linux/export.h>
26 27
27#include "nfc.h" 28#include "nfc.h"
28 29
@@ -123,11 +124,7 @@ error:
123 124
124static int rawsock_add_header(struct sk_buff *skb) 125static int rawsock_add_header(struct sk_buff *skb)
125{ 126{
126 127 *skb_push(skb, NFC_HEADER_SIZE) = 0;
127 if (skb_cow_head(skb, 1))
128 return -ENOMEM;
129
130 *skb_push(skb, 1) = 0;
131 128
132 return 0; 129 return 0;
133} 130}
@@ -197,6 +194,7 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock,
197 struct msghdr *msg, size_t len) 194 struct msghdr *msg, size_t len)
198{ 195{
199 struct sock *sk = sock->sk; 196 struct sock *sk = sock->sk;
197 struct nfc_dev *dev = nfc_rawsock(sk)->dev;
200 struct sk_buff *skb; 198 struct sk_buff *skb;
201 int rc; 199 int rc;
202 200
@@ -208,11 +206,13 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock,
208 if (sock->state != SS_CONNECTED) 206 if (sock->state != SS_CONNECTED)
209 return -ENOTCONN; 207 return -ENOTCONN;
210 208
211 skb = sock_alloc_send_skb(sk, len, msg->msg_flags & MSG_DONTWAIT, 209 skb = sock_alloc_send_skb(sk, len + dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE,
212 &rc); 210 msg->msg_flags & MSG_DONTWAIT, &rc);
213 if (!skb) 211 if (!skb)
214 return rc; 212 return rc;
215 213
214 skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE);
215
216 rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len); 216 rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len);
217 if (rc < 0) { 217 if (rc < 0) {
218 kfree_skb(skb); 218 kfree_skb(skb);