diff options
| author | David Lamparter <equinox@opensourcerouting.org> | 2018-08-10 18:46:07 +0200 | 
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2018-08-14 20:02:05 +0000 | 
| commit | 6bb30c2cbaed955383758c64cf51382dd1978cb9 (patch) | |
| tree | 156023fc555eda4843d96a708e1e115fddfba927 /zebra | |
| parent | 01b9e3fd0d354d7d4c60b1c0240f269a4fd08990 (diff) | |
*: use frr_elevate_privs() (2/2: manual)
Signed-off-by: David Lamparter <equinox@diac24.net>
Diffstat (limited to 'zebra')
| -rw-r--r-- | zebra/if_ioctl_solaris.c | 37 | ||||
| -rw-r--r-- | zebra/kernel_netlink.c | 68 | ||||
| -rw-r--r-- | zebra/kernel_socket.c | 16 | ||||
| -rw-r--r-- | zebra/zapi_msg.c | 7 | ||||
| -rw-r--r-- | zebra/zserv.c | 17 | 
5 files changed, 55 insertions, 90 deletions
diff --git a/zebra/if_ioctl_solaris.c b/zebra/if_ioctl_solaris.c index ee7f22e780..5a58fe1751 100644 --- a/zebra/if_ioctl_solaris.c +++ b/zebra/if_ioctl_solaris.c @@ -60,19 +60,21 @@ static int interface_list_ioctl(int af)  	char *buf = NULL;  	frr_elevate_privs(&zserv_privs) { -  		sock = socket(af, SOCK_DGRAM, 0); -		if (sock < 0) { -			zlog_warn("Can't make %s socket stream: %s", -				  (af == AF_INET ? "AF_INET" : "AF_INET6"), -				  safe_strerror(errno)); +	} -			return -1; -		} +	if (sock < 0) { +		zlog_warn("Can't make %s socket stream: %s", +			  (af == AF_INET ? "AF_INET" : "AF_INET6"), +			  safe_strerror(errno)); +		return -1; +	} -calculate_lifc_len: /* must hold privileges to enter here */ +calculate_lifc_len: +	frr_elevate_privs(&zserv_privs) {  		lifn.lifn_family = af; -		lifn.lifn_flags = LIFC_NOXMIT; /* we want NOXMIT interfaces too */ +		lifn.lifn_flags = LIFC_NOXMIT; +		/* we want NOXMIT interfaces too */  		ret = ioctl(sock, SIOCGLIFNUM, &lifn);  		save_errno = errno; @@ -105,27 +107,18 @@ calculate_lifc_len: /* must hold privileges to enter here */  	lifconf.lifc_len = needed;  	lifconf.lifc_buf = buf; -	if (zserv_privs.change(ZPRIVS_RAISE)) -		flog_err(LIB_ERR_PRIVILEGES, "Can't raise privileges"); - -	ret = ioctl(sock, SIOCGLIFCONF, &lifconf); +	frr_elevate_privs(&zserv_privs) { +		ret = ioctl(sock, SIOCGLIFCONF, &lifconf); +	}  	if (ret < 0) {  		if (errno == EINVAL) -			goto calculate_lifc_len; /* deliberately hold privileges -						    */ +			goto calculate_lifc_len;  		zlog_warn("SIOCGLIFCONF: %s", safe_strerror(errno)); - -		if (zserv_privs.change(ZPRIVS_LOWER)) -			flog_err(LIB_ERR_PRIVILEGES, "Can't lower privileges"); -  		goto end;  	} -	if (zserv_privs.change(ZPRIVS_LOWER)) -		flog_err(LIB_ERR_PRIVILEGES, "Can't lower privileges"); -  	/* Allocate interface. */  	lifreq = lifconf.lifc_req; 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;  	} diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c index 79721cf87a..78e25e7626 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -1385,17 +1385,11 @@ static int kernel_read(struct thread *thread)  /* Make routing socket. */  static void routing_socket(struct zebra_ns *zns)  { -	if (zserv_privs.change(ZPRIVS_RAISE)) -		flog_err(LIB_ERR_PRIVILEGES, -			  "routing_socket: Can't raise privileges"); - -	routing_sock = -		ns_socket(AF_ROUTE, SOCK_RAW, 0, zns->ns_id); +	frr_elevate_privs(&zserv_privs) { +		routing_sock = ns_socket(AF_ROUTE, SOCK_RAW, 0, zns->ns_id); +	}  	if (routing_sock < 0) { -		if (zserv_privs.change(ZPRIVS_LOWER)) -			flog_err(LIB_ERR_PRIVILEGES, -				  "routing_socket: Can't lower privileges");  		zlog_warn("Can't init kernel routing socket");  		return;  	} @@ -1407,10 +1401,6 @@ static void routing_socket(struct zebra_ns *zns)  	/*if (fcntl (routing_sock, F_SETFL, O_NONBLOCK) < 0)  	  zlog_warn ("Can't set O_NONBLOCK to routing socket");*/ -	if (zserv_privs.change(ZPRIVS_LOWER)) -		flog_err(LIB_ERR_PRIVILEGES, -			  "routing_socket: Can't lower privileges"); -  	/* kernel_read needs rewrite. */  	thread_add_read(zebrad.master, kernel_read, NULL, routing_sock, NULL);  } diff --git a/zebra/zapi_msg.c b/zebra/zapi_msg.c index a74c6bc4bf..008fc8f066 100644 --- a/zebra/zapi_msg.c +++ b/zebra/zapi_msg.c @@ -3087,12 +3087,13 @@ static void zserv_write_incoming(struct stream *orig, uint16_t command)  	copy = stream_dup(orig);  	stream_set_getp(copy, 0); -	zserv_privs.change(ZPRIVS_RAISE);  	snprintf(fname, MAXPATHLEN, "%s/%u", DAEMON_VTY_DIR, command); -	fd = open(fname, O_CREAT | O_WRONLY | O_EXCL, 0644); + +	frr_elevate_privs(&zserv_privs) { +		fd = open(fname, O_CREAT | O_WRONLY | O_EXCL, 0644); +	}  	stream_flush(copy, fd);  	close(fd); -	zserv_privs.change(ZPRIVS_LOWER);  	stream_free(copy);  }  #endif diff --git a/zebra/zserv.c b/zebra/zserv.c index 553331867c..174e010743 100644 --- a/zebra/zserv.c +++ b/zebra/zserv.c @@ -787,15 +787,14 @@ void zserv_start(char *path)  			unlink(suna->sun_path);  	} -	zserv_privs.change(ZPRIVS_RAISE); -	setsockopt_so_recvbuf(zebrad.sock, 1048576); -	setsockopt_so_sendbuf(zebrad.sock, 1048576); -	zserv_privs.change(ZPRIVS_LOWER); - -	if (sa.ss_family != AF_UNIX && zserv_privs.change(ZPRIVS_RAISE)) -		flog_err(LIB_ERR_PRIVILEGES, "Can't raise privileges"); +	frr_elevate_privs(&zserv_privs) { +		setsockopt_so_recvbuf(zebrad.sock, 1048576); +		setsockopt_so_sendbuf(zebrad.sock, 1048576); +	} -	ret = bind(zebrad.sock, (struct sockaddr *)&sa, sa_len); +	frr_elevate_privs((sa.ss_family != AF_UNIX) ? &zserv_privs : NULL) { +		ret = bind(zebrad.sock, (struct sockaddr *)&sa, sa_len); +	}  	if (ret < 0) {  		zlog_warn("Can't bind zserv socket on %s: %s", path,  			  safe_strerror(errno)); @@ -805,8 +804,6 @@ void zserv_start(char *path)  		zebrad.sock = -1;  		return;  	} -	if (sa.ss_family != AF_UNIX && zserv_privs.change(ZPRIVS_LOWER)) -		flog_err(LIB_ERR_PRIVILEGES, "Can't lower privileges");  	ret = listen(zebrad.sock, 5);  	if (ret < 0) {  | 
