On Tue, Sep 19, 2017 at 11:05:20AM +0800, Hangbin Liu wrote:
> On Mon, Sep 18, 2017 at 09:55:05AM +0200, Michal Kubecek wrote:
> > > @@ -471,19 +516,23 @@ int rtnl_dump_filter_l(struct rtnl_handle *rth,
> > >  
> > >                           if (h->nlmsg_type == NLMSG_ERROR) {
> > >                                   rtnl_dump_error(rth, h);
> > > +                                 free(buf);
> > >                                   return -1;
> > >                           }
> > >  
> > >                           if (!rth->dump_fp) {
> > >                                   err = a->filter(&nladdr, h, a->arg1);
> > > -                                 if (err < 0)
> > > +                                 if (err < 0) {
> > > +                                         free(buf);
> > >                                           return err;
> > > +                                 }
> > >                           }
> > >  
> > >  skip_it:
> > >                           h = NLMSG_NEXT(h, msglen);
> > >                   }
> > >           }
> > > +         free(buf);
> > 
> > We only free the last buffer returned by rtnl_recvmsg() this way.
> > IMHO this free(buf) should be moved inside the loop.
> 
> Do you mean the outside while loop or the for loop? I think we could
> not put it inside the for loop, because we may need the buf multi
> times based on arg.

Sorry for the confusion, you are right, this part is correct. I misread
the indentation.

Michal Kubecek

Reply via email to