diff options
Diffstat (limited to 'zebra/kernel_netlink.c')
| -rw-r--r-- | zebra/kernel_netlink.c | 68 |
1 files changed, 26 insertions, 42 deletions
diff --git a/zebra/kernel_netlink.c b/zebra/kernel_netlink.c index b397e95955..176ee93cdc 100644 --- a/zebra/kernel_netlink.c +++ b/zebra/kernel_netlink.c @@ -206,34 +206,26 @@ static int netlink_socket(struct nlsock *nl, unsigned long groups, struct sockaddr_nl snl; int sock; int namelen; - int save_errno; - - if (zserv_privs.change(ZPRIVS_RAISE)) { - flog_err(LIB_ERR_PRIVILEGES, "Can't raise privileges"); - return -1; - } - sock = ns_socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE, ns_id); - if (sock < 0) { - flog_err_sys(LIB_ERR_SOCKET, "Can't open %s socket: %s", - nl->name, safe_strerror(errno)); - return -1; - } + frr_elevate_privs(&zserv_privs) { + sock = ns_socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE, ns_id); + if (sock < 0) { + zlog_err("Can't open %s socket: %s", nl->name, + safe_strerror(errno)); + return -1; + } - memset(&snl, 0, sizeof snl); - snl.nl_family = AF_NETLINK; - snl.nl_groups = groups; + memset(&snl, 0, sizeof snl); + snl.nl_family = AF_NETLINK; + snl.nl_groups = groups; - /* Bind the socket to the netlink structure for anything. */ - ret = bind(sock, (struct sockaddr *)&snl, sizeof snl); - save_errno = errno; - if (zserv_privs.change(ZPRIVS_LOWER)) - flog_err(LIB_ERR_PRIVILEGES, "Can't lower privileges"); + /* Bind the socket to the netlink structure for anything. */ + ret = bind(sock, (struct sockaddr *)&snl, sizeof snl); + } if (ret < 0) { - flog_err_sys(LIB_ERR_SOCKET, - "Can't bind %s socket to group 0x%x: %s", nl->name, - snl.nl_groups, safe_strerror(save_errno)); + zlog_err("Can't bind %s socket to group 0x%x: %s", nl->name, + snl.nl_groups, safe_strerror(errno)); close(sock); return -1; } @@ -340,15 +332,15 @@ static void netlink_write_incoming(const char *buf, const unsigned int size, char fname[MAXPATHLEN]; FILE *f; - zserv_privs.change(ZPRIVS_RAISE); snprintf(fname, MAXPATHLEN, "%s/%s_%u", DAEMON_VTY_DIR, "netlink", counter); - f = fopen(fname, "w"); + frr_elevate_privs(&zserv_privs) { + f = fopen(fname, "w"); + } if (f) { fwrite(buf, 1, size, f); fclose(f); } - zserv_privs.change(ZPRIVS_LOWER); } /** @@ -363,8 +355,9 @@ static long netlink_read_file(char *buf, const char *fname) FILE *f; long file_bytes = -1; - zserv_privs.change(ZPRIVS_RAISE); - f = fopen(fname, "r"); + frr_elevate_privs(&zserv_privs) { + f = fopen(fname, "r"); + } if (f) { fseek(f, 0, SEEK_END); file_bytes = ftell(f); @@ -372,7 +365,6 @@ static long netlink_read_file(char *buf, const char *fname) fread(buf, NL_RCV_PKT_BUF_SIZE, 1, f); fclose(f); } - zserv_privs.change(ZPRIVS_LOWER); return file_bytes; } @@ -985,7 +977,6 @@ int netlink_request(struct nlsock *nl, struct nlmsghdr *n) { int ret; struct sockaddr_nl snl; - int save_errno; /* Check netlink socket. */ if (nl->sock < 0) { @@ -1003,21 +994,14 @@ int netlink_request(struct nlsock *nl, struct nlmsghdr *n) snl.nl_family = AF_NETLINK; /* Raise capabilities and send message, then lower capabilities. */ - if (zserv_privs.change(ZPRIVS_RAISE)) { - flog_err(LIB_ERR_PRIVILEGES, "Can't raise privileges"); - return -1; + frr_elevate_privs(&zserv_privs) { + ret = sendto(nl->sock, (void *)n, n->nlmsg_len, 0, + (struct sockaddr *)&snl, sizeof snl); } - ret = sendto(nl->sock, (void *)n, n->nlmsg_len, 0, - (struct sockaddr *)&snl, sizeof snl); - save_errno = errno; - - if (zserv_privs.change(ZPRIVS_LOWER)) - flog_err(LIB_ERR_PRIVILEGES, "Can't lower privileges"); - if (ret < 0) { - flog_err_sys(LIB_ERR_SOCKET, "%s sendto failed: %s", nl->name, - safe_strerror(save_errno)); + zlog_err("%s sendto failed: %s", nl->name, + safe_strerror(errno)); return -1; } |
