[ovs-dev] [leaks 1/3] ofproto-dpif: Fix memory leak in port_dump_next().

Ben Pfaff blp at nicira.com
Thu Jan 31 23:53:34 UTC 2013


Thanks, applied to master.

On Fri, Jan 25, 2013 at 03:11:22PM -0800, Ethan Jackson wrote:
> Acked-by: Ethan Jackson <ethan at nicira.com>
> 
> On Thu, Jan 24, 2013 at 3:20 PM, Ben Pfaff <blp at nicira.com> wrote:
> > The caller of port_query_by_name() is responsible for freeing the
> > ofproto_port that it returns on success, but ofproto-dpif did not do this.
> >
> > Signed-off-by: Ben Pfaff <blp at nicira.com>
> > ---
> >  ofproto/ofproto-dpif.c |   20 ++++++++++++++++++--
> >  1 files changed, 18 insertions(+), 2 deletions(-)
> >
> > diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> > index d75a63c..411795a 100644
> > --- a/ofproto/ofproto-dpif.c
> > +++ b/ofproto/ofproto-dpif.c
> > @@ -1561,8 +1561,10 @@ port_construct(struct ofport *port_)
> >      if (odp_port_to_ofp_port(ofproto, port->odp_port) != OFPP_NONE) {
> >          VLOG_ERR("port %s already has an OpenFlow port number\n",
> >                   dpif_port.name);
> > +        dpif_port_destroy(&dpif_port);
> >          return EBUSY;
> >      }
> > +    dpif_port_destroy(&dpif_port);
> >
> >      hmap_insert(&ofproto->backer->odp_to_ofport_map, &port->odp_port_node,
> >                  hash_int(port->odp_port, 0));
> > @@ -3058,6 +3060,9 @@ struct port_dump_state {
> >      uint32_t bucket;
> >      uint32_t offset;
> >      bool ghost;
> > +
> > +    struct ofproto_port port;
> > +    bool has_port;
> >  };
> >
> >  static int
> > @@ -3076,12 +3081,20 @@ port_dump_next(const struct ofproto *ofproto_ OVS_UNUSED, void *state_,
> >      const struct sset *sset;
> >      struct sset_node *node;
> >
> > +    if (state->has_port) {
> > +        ofproto_port_destroy(&state->port);
> > +        state->has_port = false;
> > +    }
> >      sset = state->ghost ? &ofproto->ghost_ports : &ofproto->ports;
> >      while ((node = sset_at_position(sset, &state->bucket, &state->offset))) {
> >          int error;
> >
> > -        error = port_query_by_name(ofproto_, node->name, port);
> > -        if (error != ENODEV) {
> > +        error = port_query_by_name(ofproto_, node->name, &state->port);
> > +        if (!error) {
> > +            *port = state->port;
> > +            state->has_port = true;
> > +            return 0;
> > +        } else if (error != ENODEV) {
> >              return error;
> >          }
> >      }
> > @@ -3101,6 +3114,9 @@ port_dump_done(const struct ofproto *ofproto_ OVS_UNUSED, void *state_)
> >  {
> >      struct port_dump_state *state = state_;
> >
> > +    if (state->has_port) {
> > +        ofproto_port_destroy(&state->port);
> > +    }
> >      free(state);
> >      return 0;
> >  }
> > --
> > 1.7.2.5
> >
> > _______________________________________________
> > dev mailing list
> > dev at openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list