| From foo@baz Wed May 31 09:13:34 JST 2017 |
| From: Douglas Caetano dos Santos <douglascs@taghos.com.br> |
| Date: Fri, 12 May 2017 15:19:15 -0300 |
| Subject: net/packet: fix missing net_device reference release |
| |
| From: Douglas Caetano dos Santos <douglascs@taghos.com.br> |
| |
| |
| [ Upstream commit d19b183cdc1fa3d70d6abe2a4c369e748cd7ebb8 ] |
| |
| When using a TX ring buffer, if an error occurs processing a control |
| message (e.g. invalid message), the net_device reference is not |
| released. |
| |
| Fixes c14ac9451c348 ("sock: enable timestamping using control messages") |
| Signed-off-by: Douglas Caetano dos Santos <douglascs@taghos.com.br> |
| Acked-by: Soheil Hassas Yeganeh <soheil@google.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| net/packet/af_packet.c | 14 +++++++------- |
| 1 file changed, 7 insertions(+), 7 deletions(-) |
| |
| --- a/net/packet/af_packet.c |
| +++ b/net/packet/af_packet.c |
| @@ -2652,13 +2652,6 @@ static int tpacket_snd(struct packet_soc |
| dev = dev_get_by_index(sock_net(&po->sk), saddr->sll_ifindex); |
| } |
| |
| - sockc.tsflags = po->sk.sk_tsflags; |
| - if (msg->msg_controllen) { |
| - err = sock_cmsg_send(&po->sk, msg, &sockc); |
| - if (unlikely(err)) |
| - goto out; |
| - } |
| - |
| err = -ENXIO; |
| if (unlikely(dev == NULL)) |
| goto out; |
| @@ -2666,6 +2659,13 @@ static int tpacket_snd(struct packet_soc |
| if (unlikely(!(dev->flags & IFF_UP))) |
| goto out_put; |
| |
| + sockc.tsflags = po->sk.sk_tsflags; |
| + if (msg->msg_controllen) { |
| + err = sock_cmsg_send(&po->sk, msg, &sockc); |
| + if (unlikely(err)) |
| + goto out_put; |
| + } |
| + |
| if (po->sk.sk_socket->type == SOCK_RAW) |
| reserve = dev->hard_header_len; |
| size_max = po->tx_ring.frame_size |