Commit bd82393c authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by David S. Miller

[SK_BUFF]: More skb_reset_transport_header conversions

These are a bit more subtle, they are of this type:

-       skb->h.raw = payload;
        __skb_pull(skb, payload - skb->data);
+       skb_reset_transport_header(skb);

__skb_pull results in:

skb->data = skb->data + payload - skb->data;
skb->data = payload;

So after __skb_pull we have skb->data pointing to payload and we can
just call skb_reset_transport_header(skb), that will do:

skb->h.raw = payload;

The others are similar, allowing us to get rid of some more cases where a
pointer was being attributed to the layer headers.
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 39b89160
...@@ -278,10 +278,12 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err, ...@@ -278,10 +278,12 @@ void ip_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
skb_network_header(skb); skb_network_header(skb);
serr->port = port; serr->port = port;
skb->h.raw = payload; if (skb_pull(skb, payload - skb->data) != NULL) {
if (!skb_pull(skb, payload - skb->data) || skb_reset_transport_header(skb);
sock_queue_err_skb(sk, skb)) if (sock_queue_err_skb(sk, skb) == 0)
kfree_skb(skb); return;
}
kfree_skb(skb);
} }
void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 info) void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 info)
...@@ -314,8 +316,8 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf ...@@ -314,8 +316,8 @@ void ip_local_error(struct sock *sk, int err, __be32 daddr, __be16 port, u32 inf
serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb); serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
serr->port = port; serr->port = port;
skb->h.raw = skb->tail;
__skb_pull(skb, skb->tail - skb->data); __skb_pull(skb, skb->tail - skb->data);
skb_reset_transport_header(skb);
if (sock_queue_err_skb(sk, skb)) if (sock_queue_err_skb(sk, skb))
kfree_skb(skb); kfree_skb(skb);
......
...@@ -231,8 +231,8 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, ...@@ -231,8 +231,8 @@ void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err,
skb_network_header(skb); skb_network_header(skb);
serr->port = port; serr->port = port;
skb->h.raw = payload;
__skb_pull(skb, payload - skb->data); __skb_pull(skb, payload - skb->data);
skb_reset_transport_header(skb);
if (sock_queue_err_skb(sk, skb)) if (sock_queue_err_skb(sk, skb))
kfree_skb(skb); kfree_skb(skb);
...@@ -268,8 +268,8 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info) ...@@ -268,8 +268,8 @@ void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info)
serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb); serr->addr_offset = (u8 *)&iph->daddr - skb_network_header(skb);
serr->port = fl->fl_ip_dport; serr->port = fl->fl_ip_dport;
skb->h.raw = skb->tail;
__skb_pull(skb, skb->tail - skb->data); __skb_pull(skb, skb->tail - skb->data);
skb_reset_transport_header(skb);
if (sock_queue_err_skb(sk, skb)) if (sock_queue_err_skb(sk, skb))
kfree_skb(skb); kfree_skb(skb);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment