Commit b8cf1e9a authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Stephen Hemminger

iproute: Fix errno propagation from rtnl_talk

Callers of rtnl_talk check errno value for their needs. In particular, the addrs
and routes restoring code validly reports success if the EEXISTS is in there.

However, the errno value can be sometimes screwed up by the perror call. Thus
we should only set it _after_ the message was emitted.
Signed-off-by: default avatarPavel Emelyanov <xemul@parallels.com>
parent d89fbf32
......@@ -360,13 +360,14 @@ int rtnl_talk(struct rtnl_handle *rtnl, struct nlmsghdr *n, pid_t peer,
if (l < sizeof(struct nlmsgerr)) {
fprintf(stderr, "ERROR truncated\n");
} else {
errno = -err->error;
if (errno == 0) {
if (!err->error) {
if (answer)
memcpy(answer, h, h->nlmsg_len);
return 0;
}
perror("RTNETLINK answers");
fprintf(stderr, "RTNETLINK answers: %s\n", strerror(-err->error));
errno = -err->error;
}
return -1;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment