diff options
Diffstat (limited to 'net/openvswitch/vport-gre.c')
-rw-r--r-- | net/openvswitch/vport-gre.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/net/openvswitch/vport-gre.c b/net/openvswitch/vport-gre.c index 6b69df545b1d..d4168c442db5 100644 --- a/net/openvswitch/vport-gre.c +++ b/net/openvswitch/vport-gre.c | |||
@@ -73,7 +73,7 @@ static struct sk_buff *__build_header(struct sk_buff *skb, | |||
73 | 73 | ||
74 | skb = gre_handle_offloads(skb, !!(tun_key->tun_flags & TUNNEL_CSUM)); | 74 | skb = gre_handle_offloads(skb, !!(tun_key->tun_flags & TUNNEL_CSUM)); |
75 | if (IS_ERR(skb)) | 75 | if (IS_ERR(skb)) |
76 | return NULL; | 76 | return skb; |
77 | 77 | ||
78 | tpi.flags = filter_tnl_flags(tun_key->tun_flags); | 78 | tpi.flags = filter_tnl_flags(tun_key->tun_flags); |
79 | tpi.proto = htons(ETH_P_TEB); | 79 | tpi.proto = htons(ETH_P_TEB); |
@@ -144,7 +144,7 @@ static int gre_tnl_send(struct vport *vport, struct sk_buff *skb) | |||
144 | 144 | ||
145 | if (unlikely(!OVS_CB(skb)->egress_tun_info)) { | 145 | if (unlikely(!OVS_CB(skb)->egress_tun_info)) { |
146 | err = -EINVAL; | 146 | err = -EINVAL; |
147 | goto error; | 147 | goto err_free_skb; |
148 | } | 148 | } |
149 | 149 | ||
150 | tun_key = &OVS_CB(skb)->egress_tun_info->tunnel; | 150 | tun_key = &OVS_CB(skb)->egress_tun_info->tunnel; |
@@ -157,8 +157,10 @@ static int gre_tnl_send(struct vport *vport, struct sk_buff *skb) | |||
157 | fl.flowi4_proto = IPPROTO_GRE; | 157 | fl.flowi4_proto = IPPROTO_GRE; |
158 | 158 | ||
159 | rt = ip_route_output_key(net, &fl); | 159 | rt = ip_route_output_key(net, &fl); |
160 | if (IS_ERR(rt)) | 160 | if (IS_ERR(rt)) { |
161 | return PTR_ERR(rt); | 161 | err = PTR_ERR(rt); |
162 | goto err_free_skb; | ||
163 | } | ||
162 | 164 | ||
163 | tunnel_hlen = ip_gre_calc_hlen(tun_key->tun_flags); | 165 | tunnel_hlen = ip_gre_calc_hlen(tun_key->tun_flags); |
164 | 166 | ||
@@ -183,8 +185,9 @@ static int gre_tnl_send(struct vport *vport, struct sk_buff *skb) | |||
183 | 185 | ||
184 | /* Push Tunnel header. */ | 186 | /* Push Tunnel header. */ |
185 | skb = __build_header(skb, tunnel_hlen); | 187 | skb = __build_header(skb, tunnel_hlen); |
186 | if (unlikely(!skb)) { | 188 | if (IS_ERR(skb)) { |
187 | err = 0; | 189 | err = PTR_ERR(skb); |
190 | skb = NULL; | ||
188 | goto err_free_rt; | 191 | goto err_free_rt; |
189 | } | 192 | } |
190 | 193 | ||
@@ -198,7 +201,8 @@ static int gre_tnl_send(struct vport *vport, struct sk_buff *skb) | |||
198 | tun_key->ipv4_tos, tun_key->ipv4_ttl, df, false); | 201 | tun_key->ipv4_tos, tun_key->ipv4_ttl, df, false); |
199 | err_free_rt: | 202 | err_free_rt: |
200 | ip_rt_put(rt); | 203 | ip_rt_put(rt); |
201 | error: | 204 | err_free_skb: |
205 | kfree_skb(skb); | ||
202 | return err; | 206 | return err; |
203 | } | 207 | } |
204 | 208 | ||