diff options
Diffstat (limited to 'net/nfc/rawsock.c')
-rw-r--r-- | net/nfc/rawsock.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/net/nfc/rawsock.c b/net/nfc/rawsock.c index 52de84a55115..9fd652a51424 100644 --- a/net/nfc/rawsock.c +++ b/net/nfc/rawsock.c | |||
@@ -123,11 +123,7 @@ error: | |||
123 | 123 | ||
124 | static int rawsock_add_header(struct sk_buff *skb) | 124 | static int rawsock_add_header(struct sk_buff *skb) |
125 | { | 125 | { |
126 | 126 | *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 | 127 | ||
132 | return 0; | 128 | return 0; |
133 | } | 129 | } |
@@ -197,6 +193,7 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
197 | struct msghdr *msg, size_t len) | 193 | struct msghdr *msg, size_t len) |
198 | { | 194 | { |
199 | struct sock *sk = sock->sk; | 195 | struct sock *sk = sock->sk; |
196 | struct nfc_dev *dev = nfc_rawsock(sk)->dev; | ||
200 | struct sk_buff *skb; | 197 | struct sk_buff *skb; |
201 | int rc; | 198 | int rc; |
202 | 199 | ||
@@ -208,11 +205,13 @@ static int rawsock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
208 | if (sock->state != SS_CONNECTED) | 205 | if (sock->state != SS_CONNECTED) |
209 | return -ENOTCONN; | 206 | return -ENOTCONN; |
210 | 207 | ||
211 | skb = sock_alloc_send_skb(sk, len, msg->msg_flags & MSG_DONTWAIT, | 208 | skb = sock_alloc_send_skb(sk, len + dev->tx_headroom + dev->tx_tailroom + NFC_HEADER_SIZE, |
212 | &rc); | 209 | msg->msg_flags & MSG_DONTWAIT, &rc); |
213 | if (!skb) | 210 | if (!skb) |
214 | return rc; | 211 | return rc; |
215 | 212 | ||
213 | skb_reserve(skb, dev->tx_headroom + NFC_HEADER_SIZE); | ||
214 | |||
216 | rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len); | 215 | rc = memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len); |
217 | if (rc < 0) { | 216 | if (rc < 0) { |
218 | kfree_skb(skb); | 217 | kfree_skb(skb); |