Fix memory leaks when sending of message failed

Various callers of nl_send_auto_complete() failed to
free the allocated message when an error was reported.
This commit is contained in:
Thomas Graf 2008-05-15 13:45:41 +02:00
parent 1155370f52
commit ef50a38fbd
6 changed files with 36 additions and 24 deletions

View file

@ -154,10 +154,11 @@ int rtnl_class_add(struct nl_sock *sk, struct rtnl_class *class, int flags)
if ((err = rtnl_class_build_add_request(class, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}

View file

@ -169,10 +169,11 @@ int rtnl_cls_add(struct nl_sock *sk, struct rtnl_cls *cls, int flags)
if ((err = rtnl_cls_build_add_request(cls, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}
@ -215,10 +216,11 @@ int rtnl_cls_change(struct nl_sock *sk, struct rtnl_cls *cls, int flags)
if ((err = rtnl_cls_build_change_request(cls, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}
@ -262,10 +264,11 @@ int rtnl_cls_delete(struct nl_sock *sk, struct rtnl_cls *cls, int flags)
if ((err = rtnl_cls_build_delete_request(cls, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}

View file

@ -1047,10 +1047,11 @@ int rtnl_link_change(struct nl_sock *sk, struct rtnl_link *old,
if ((err = rtnl_link_build_change_request(old, tmpl, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}

View file

@ -653,10 +653,11 @@ int rtnl_neigh_add(struct nl_sock *sk, struct rtnl_neigh *tmpl, int flags)
if ((err = rtnl_neigh_build_add_request(tmpl, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}
@ -708,10 +709,11 @@ int rtnl_neigh_delete(struct nl_sock *sk, struct rtnl_neigh *neigh,
if ((err = rtnl_neigh_build_delete_request(neigh, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}
@ -767,10 +769,11 @@ int rtnl_neigh_change(struct nl_sock *sk, struct rtnl_neigh *neigh, int flags)
if ((err = rtnl_neigh_build_change_request(neigh, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}

View file

@ -590,10 +590,11 @@ int rtnl_neightbl_change(struct nl_sock *sk, struct rtnl_neightbl *old,
if ((err = rtnl_neightbl_build_change_request(old, tmpl, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}

View file

@ -233,10 +233,11 @@ int rtnl_qdisc_add(struct nl_sock *sk, struct rtnl_qdisc *qdisc,
if ((err = rtnl_qdisc_build_add_request(qdisc, flags, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}
@ -288,10 +289,11 @@ int rtnl_qdisc_change(struct nl_sock *sk, struct rtnl_qdisc *qdisc,
if ((err = rtnl_qdisc_build_change_request(qdisc, new, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}
@ -360,10 +362,11 @@ int rtnl_qdisc_delete(struct nl_sock *sk, struct rtnl_qdisc *qdisc)
if ((err = rtnl_qdisc_build_delete_request(qdisc, &msg)) < 0)
return err;
if ((err = nl_send_auto_complete(sk, msg)) < 0)
err = nl_send_auto_complete(sk, msg);
nlmsg_free(msg);
if (err < 0)
return err;
nlmsg_free(msg);
return nl_wait_for_ack(sk);
}