In a few places in queue_userspace_packets() when we encounter an
error, we don't actually set the 'err' variable.  Although we
free the packets we don't correctly account for these packets as
being lost.

Signed-off-by: Jesse Gross <[email protected]>
---
 datapath/datapath.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index 98c2baf..1fba23b 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -449,8 +449,10 @@ static int queue_userspace_packets(struct datapath *dp, 
struct sk_buff *skb,
                if (unlikely(err))
                        goto err_kfree_skbs;
 
-               if (nla_attr_size(skb->len) > USHRT_MAX)
+               if (nla_attr_size(skb->len) > USHRT_MAX) {
+                       err = -EFBIG;
                        goto err_kfree_skbs;
+               }
 
                len = sizeof(struct ovs_header);
                len += nla_total_size(skb->len);
@@ -465,6 +467,7 @@ static int queue_userspace_packets(struct datapath *dp, 
struct sk_buff *skb,
                user_skb = genlmsg_new(len, GFP_ATOMIC);
                if (!user_skb) {
                        netlink_set_err(INIT_NET_GENL_SOCK, 0, group, -ENOBUFS);
+                       err = -ENOMEM;
                        goto err_kfree_skbs;
                }
 
-- 
1.7.4.1

_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to