From 4be019d5530e21c9e54e41e46a57ab071b9b11ae Mon Sep 17 00:00:00 2001 From: ajs Date: Sat, 29 Jan 2005 16:12:41 +0000 Subject: 2005-01-29 Andrew J. Schorr * rt_netlink.c: (netlink_socket,netlink_request,netlink_parse_info, netlink_talk) Save errno before calling zserv_privs.change. [backport candidate] --- zebra/rt_netlink.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'zebra/rt_netlink.c') diff --git a/zebra/rt_netlink.c b/zebra/rt_netlink.c index f5903a63..0d9bbbd4 100644 --- a/zebra/rt_netlink.c +++ b/zebra/rt_netlink.c @@ -94,6 +94,7 @@ netlink_socket (struct nlsock *nl, unsigned long groups) struct sockaddr_nl snl; int sock; int namelen; + int save_errno; sock = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE); if (sock < 0) @@ -166,13 +167,14 @@ netlink_socket (struct nlsock *nl, unsigned long groups) } ret = bind (sock, (struct sockaddr *) &snl, sizeof snl); + save_errno = errno; if (zserv_privs.change (ZPRIVS_LOWER)) zlog (NULL, LOG_ERR, "Can't lower privileges"); if (ret < 0) { zlog (NULL, LOG_ERR, "Can't bind %s socket to group 0x%x: %s", - nl->name, snl.nl_groups, safe_strerror (errno)); + nl->name, snl.nl_groups, safe_strerror (save_errno)); close (sock); return -1; } @@ -234,6 +236,7 @@ netlink_request (int family, int type, struct nlsock *nl) { int ret; struct sockaddr_nl snl; + int save_errno; struct { @@ -270,6 +273,7 @@ netlink_request (int family, int type, struct nlsock *nl) ret = sendto (nl->sock, (void *) &req, sizeof req, 0, (struct sockaddr *) &snl, sizeof snl); + save_errno = errno; if (zserv_privs.change (ZPRIVS_LOWER)) zlog (NULL, LOG_ERR, "Can't lower privileges"); @@ -277,7 +281,7 @@ netlink_request (int family, int type, struct nlsock *nl) if (ret < 0) { zlog (NULL, LOG_ERR, "%s sendto failed: %s", nl->name, - safe_strerror (errno)); + safe_strerror (save_errno)); return -1; } @@ -301,22 +305,25 @@ netlink_parse_info (int (*filter) (struct sockaddr_nl *, struct nlmsghdr *), struct sockaddr_nl snl; struct msghdr msg = { (void *) &snl, sizeof snl, &iov, 1, NULL, 0, 0 }; struct nlmsghdr *h; + int save_errno; if (zserv_privs.change (ZPRIVS_RAISE)) zlog (NULL, LOG_ERR, "Can't raise privileges"); status = recvmsg (nl->sock, &msg, 0); + save_errno = errno; if (zserv_privs.change (ZPRIVS_LOWER)) zlog (NULL, LOG_ERR, "Can't lower privileges"); if (status < 0) { - if (errno == EINTR) + if (save_errno == EINTR) continue; - if (errno == EWOULDBLOCK || errno == EAGAIN) + if (save_errno == EWOULDBLOCK || save_errno == EAGAIN) break; - zlog (NULL, LOG_ERR, "%s recvmsg overrun", nl->name); + zlog (NULL, LOG_ERR, "%s recvmsg overrun: %s", + nl->name, safe_strerror(save_errno)); continue; } @@ -1221,6 +1228,7 @@ netlink_talk (struct nlmsghdr *n, struct nlsock *nl) struct msghdr msg = { (void *) &snl, sizeof snl, &iov, 1, NULL, 0, 0 }; int flags = 0; int snb_ret; + int save_errno; memset (&snl, 0, sizeof snl); snl.nl_family = AF_NETLINK; @@ -1239,13 +1247,14 @@ netlink_talk (struct nlmsghdr *n, struct nlsock *nl) if (zserv_privs.change (ZPRIVS_RAISE)) zlog (NULL, LOG_ERR, "Can't raise privileges"); status = sendmsg (nl->sock, &msg, 0); + save_errno = errno; if (zserv_privs.change (ZPRIVS_LOWER)) zlog (NULL, LOG_ERR, "Can't lower privileges"); if (status < 0) { zlog (NULL, LOG_ERR, "netlink_talk sendmsg() error: %s", - safe_strerror (errno)); + safe_strerror (save_errno)); return -1; } -- cgit v1.2.1