[prev in list] [next in list] [prev in thread] [next in thread]
List: openvswitch-dev
Subject: [ovs-dev] [loops 4/6] datapath: Propagate packet transmit errors to execute_actions() caller.
From: blp () nicira ! com (Ben Pfaff)
Date: 2010-07-27 17:12:32
Message-ID: 20100727171232.GC8777 () nicira ! com
[Download RAW message or body]
On Mon, Jul 26, 2010 at 04:11:03PM -0700, Jesse Gross wrote:
> On Fri, Jul 23, 2010 at 4:44 PM, Ben Pfaff <blp at nicira.com> wrote:
> >
> > +static struct dp_port *output_group(struct datapath *dp, __u16 group,
> > + struct sk_buff *skb, gfp_t gfp)
> > {
> > - struct dp_port_group *g = rcu_dereference(dp->groups[group]);
> > - int prev_port = -1;
> > + struct dp_port_group *g;
> > + struct dp_port *prev_port;
>
> I think you want to initialize prev_port to NULL.
Ouch. Usually I expect GCC to warn about this kind of egregious
problem, but it didn't.
>
> > case ODPAT_OUTPUT_GROUP:
> > prev_port = output_group(dp, a->output_group.group,
> > skb, gfp);
> > + if (IS_ERR(prev_port))
> > + return PTR_ERR(prev_port);
> >
>
> Isn't this going to leak the original skb in the event of an error?
Good catch, thank you. I added a "kfree_skb(skb);" before the return.
> > @@ -488,10 +499,10 @@ int execute_actions(struct datapath *dp, struct
> > sk_buff *skb,
> > }
> > if (!skb)
> > return -ENOMEM;
> >
>
> I think there's a missing closing brace for the for loop here.
Oops.
> > + if (prev_port) {
> > + err = vport_send(prev_port->vport, skb);
> > + if (unlikely(err < 0))
> > + return err;
> > }
> > - if (prev_port != -1)
> > - do_output(dp, skb, prev_port);
> > - else
> > - kfree_skb(skb);
>
>
> Don't we need to free the skb if !prev_port?
Yes.
Boy, I really screwed up on this patch. I must not have even compiled it,
and yet I remember doing that.
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic