aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesse Gross <jesse@nicira.com>2010-06-17 15:17:53 -0700
committerJesse Gross <jesse@nicira.com>2010-06-18 11:38:10 -0700
commitb28c72ba7c992bcd2f5b65be0799a2d9422df21f (patch)
tree0381771d32edcf02e5143139f29dc8f93475259f
parenta2377e444a0e0a3f3c6db2502c63cc9545572281 (diff)
datapath: Check vswitch_skb_checksum_setup() return code.
If vswitch_skb_checksum_setup() returns an error, the checksum pointers probably haven't been set correctly which could cause a crash later. We should give up immediately on error.
-rw-r--r--datapath/actions.c8
-rw-r--r--datapath/vport-gre.c4
2 files changed, 10 insertions, 2 deletions
diff --git a/datapath/actions.c b/datapath/actions.c
index ff67372a..f7e51d92 100644
--- a/datapath/actions.c
+++ b/datapath/actions.c
@@ -113,6 +113,8 @@ modify_vlan_tci(struct datapath *dp, struct sk_buff *skb,
~skb->csum);
}
} else {
+ int err;
+
/* Add vlan header */
/* Set up checksumming pointers for checksum-deferred packets
@@ -120,7 +122,11 @@ modify_vlan_tci(struct datapath *dp, struct sk_buff *skb,
* when we send the packet out on the wire, and it will fail at
* that point because skb_checksum_setup() will not look inside
* an 802.1Q header. */
- vswitch_skb_checksum_setup(skb);
+ err = vswitch_skb_checksum_setup(skb);
+ if (unlikely(err)) {
+ kfree_skb(skb);
+ return ERR_PTR(err);
+ }
/* GSO is not implemented for packets with an 802.1Q header, so
* we have to do segmentation before we add that header.
diff --git a/datapath/vport-gre.c b/datapath/vport-gre.c
index 98e0abc3..c71cc34d 100644
--- a/datapath/vport-gre.c
+++ b/datapath/vport-gre.c
@@ -1131,7 +1131,9 @@ gre_send(struct vport *vport, struct sk_buff *skb)
}
forward_ip_summed(skb);
- vswitch_skb_checksum_setup(skb);
+
+ if (unlikely(vswitch_skb_checksum_setup(skb)))
+ goto error_free;
skb = handle_gso(skb);
if (unlikely(IS_ERR(skb))) {