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:
quoted
quoted
@@ -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