mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 14:17:20 +00:00
*: frr_elevate_privs -> frr_with_privs
Signed-off-by: David Lamparter <equinox@opensourcerouting.org>
This commit is contained in:
parent
ba28659f1c
commit
0cf6db21ec
@ -29,7 +29,7 @@ ForEachMacros:
|
|||||||
- frr_each_safe
|
- frr_each_safe
|
||||||
- frr_each_from
|
- frr_each_from
|
||||||
- frr_with_mutex
|
- frr_with_mutex
|
||||||
- frr_elevate_privs
|
- frr_with_privs
|
||||||
- LIST_FOREACH
|
- LIST_FOREACH
|
||||||
- LIST_FOREACH_SAFE
|
- LIST_FOREACH_SAFE
|
||||||
- SLIST_FOREACH
|
- SLIST_FOREACH
|
||||||
|
@ -894,7 +894,7 @@ int bp_udp_shop(vrf_id_t vrf_id)
|
|||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
}
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
@ -909,7 +909,7 @@ int bp_udp_mhop(vrf_id_t vrf_id)
|
|||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
}
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
@ -934,7 +934,7 @@ int bp_peer_socket(const struct bfd_session *bs)
|
|||||||
&& bs->key.vrfname[0])
|
&& bs->key.vrfname[0])
|
||||||
device_to_bind = (const char *)bs->key.vrfname;
|
device_to_bind = (const char *)bs->key.vrfname;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC,
|
sd = vrf_socket(AF_INET, SOCK_DGRAM, PF_UNSPEC,
|
||||||
bs->vrf->vrf_id, device_to_bind);
|
bs->vrf->vrf_id, device_to_bind);
|
||||||
}
|
}
|
||||||
@ -1001,7 +1001,7 @@ int bp_peer_socketv6(const struct bfd_session *bs)
|
|||||||
&& bs->key.vrfname[0])
|
&& bs->key.vrfname[0])
|
||||||
device_to_bind = (const char *)bs->key.vrfname;
|
device_to_bind = (const char *)bs->key.vrfname;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC,
|
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC,
|
||||||
bs->vrf->vrf_id, device_to_bind);
|
bs->vrf->vrf_id, device_to_bind);
|
||||||
}
|
}
|
||||||
@ -1121,7 +1121,7 @@ int bp_udp6_shop(vrf_id_t vrf_id)
|
|||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
}
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
@ -1137,7 +1137,7 @@ int bp_udp6_mhop(vrf_id_t vrf_id)
|
|||||||
{
|
{
|
||||||
int sd;
|
int sd;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
sd = vrf_socket(AF_INET6, SOCK_DGRAM, PF_UNSPEC, vrf_id, NULL);
|
||||||
}
|
}
|
||||||
if (sd == -1)
|
if (sd == -1)
|
||||||
@ -1153,7 +1153,7 @@ int bp_echo_socket(vrf_id_t vrf_id)
|
|||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
s = vrf_socket(AF_INET, SOCK_DGRAM, 0, vrf_id, NULL);
|
s = vrf_socket(AF_INET, SOCK_DGRAM, 0, vrf_id, NULL);
|
||||||
}
|
}
|
||||||
if (s == -1)
|
if (s == -1)
|
||||||
@ -1169,7 +1169,7 @@ int bp_echov6_socket(vrf_id_t vrf_id)
|
|||||||
{
|
{
|
||||||
int s;
|
int s;
|
||||||
|
|
||||||
frr_elevate_privs(&bglobal.bfdd_privs) {
|
frr_with_privs(&bglobal.bfdd_privs) {
|
||||||
s = vrf_socket(AF_INET6, SOCK_DGRAM, 0, vrf_id, NULL);
|
s = vrf_socket(AF_INET6, SOCK_DGRAM, 0, vrf_id, NULL);
|
||||||
}
|
}
|
||||||
if (s == -1)
|
if (s == -1)
|
||||||
|
@ -122,7 +122,7 @@ static int bgp_md5_set_connect(int socket, union sockunion *su,
|
|||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
#if HAVE_DECL_TCP_MD5SIG
|
#if HAVE_DECL_TCP_MD5SIG
|
||||||
frr_elevate_privs(&bgpd_privs) {
|
frr_with_privs(&bgpd_privs) {
|
||||||
ret = bgp_md5_set_socket(socket, su, prefixlen, password);
|
ret = bgp_md5_set_socket(socket, su, prefixlen, password);
|
||||||
}
|
}
|
||||||
#endif /* HAVE_TCP_MD5SIG */
|
#endif /* HAVE_TCP_MD5SIG */
|
||||||
@ -140,8 +140,7 @@ static int bgp_md5_set_password(struct peer *peer, const char *password)
|
|||||||
* Set or unset the password on the listen socket(s). Outbound
|
* Set or unset the password on the listen socket(s). Outbound
|
||||||
* connections are taken care of in bgp_connect() below.
|
* connections are taken care of in bgp_connect() below.
|
||||||
*/
|
*/
|
||||||
frr_elevate_privs(&bgpd_privs)
|
frr_with_privs(&bgpd_privs) {
|
||||||
{
|
|
||||||
for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener))
|
for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener))
|
||||||
if (listener->su.sa.sa_family
|
if (listener->su.sa.sa_family
|
||||||
== peer->su.sa.sa_family) {
|
== peer->su.sa.sa_family) {
|
||||||
@ -167,8 +166,7 @@ int bgp_md5_set_prefix(struct prefix *p, const char *password)
|
|||||||
struct bgp_listener *listener;
|
struct bgp_listener *listener;
|
||||||
|
|
||||||
/* Set or unset the password on the listen socket(s). */
|
/* Set or unset the password on the listen socket(s). */
|
||||||
frr_elevate_privs(&bgpd_privs)
|
frr_with_privs(&bgpd_privs) {
|
||||||
{
|
|
||||||
for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener))
|
for (ALL_LIST_ELEMENTS_RO(bm->listen_sockets, node, listener))
|
||||||
if (listener->su.sa.sa_family == p->family) {
|
if (listener->su.sa.sa_family == p->family) {
|
||||||
prefix2sockunion(p, &su);
|
prefix2sockunion(p, &su);
|
||||||
@ -610,7 +608,7 @@ int bgp_connect(struct peer *peer)
|
|||||||
zlog_debug("Peer address not learnt: Returning from connect");
|
zlog_debug("Peer address not learnt: Returning from connect");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
frr_elevate_privs(&bgpd_privs) {
|
frr_with_privs(&bgpd_privs) {
|
||||||
/* Make socket for the peer. */
|
/* Make socket for the peer. */
|
||||||
peer->fd = vrf_sockunion_socket(&peer->su, peer->bgp->vrf_id,
|
peer->fd = vrf_sockunion_socket(&peer->su, peer->bgp->vrf_id,
|
||||||
bgp_get_bound_name(peer));
|
bgp_get_bound_name(peer));
|
||||||
@ -630,7 +628,7 @@ int bgp_connect(struct peer *peer)
|
|||||||
sockopt_reuseport(peer->fd);
|
sockopt_reuseport(peer->fd);
|
||||||
|
|
||||||
#ifdef IPTOS_PREC_INTERNETCONTROL
|
#ifdef IPTOS_PREC_INTERNETCONTROL
|
||||||
frr_elevate_privs(&bgpd_privs) {
|
frr_with_privs(&bgpd_privs) {
|
||||||
if (sockunion_family(&peer->su) == AF_INET)
|
if (sockunion_family(&peer->su) == AF_INET)
|
||||||
setsockopt_ipv4_tos(peer->fd,
|
setsockopt_ipv4_tos(peer->fd,
|
||||||
IPTOS_PREC_INTERNETCONTROL);
|
IPTOS_PREC_INTERNETCONTROL);
|
||||||
@ -708,7 +706,7 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen,
|
|||||||
sockopt_reuseaddr(sock);
|
sockopt_reuseaddr(sock);
|
||||||
sockopt_reuseport(sock);
|
sockopt_reuseport(sock);
|
||||||
|
|
||||||
frr_elevate_privs(&bgpd_privs) {
|
frr_with_privs(&bgpd_privs) {
|
||||||
|
|
||||||
#ifdef IPTOS_PREC_INTERNETCONTROL
|
#ifdef IPTOS_PREC_INTERNETCONTROL
|
||||||
if (sa->sa_family == AF_INET)
|
if (sa->sa_family == AF_INET)
|
||||||
@ -767,7 +765,7 @@ int bgp_socket(struct bgp *bgp, unsigned short port, const char *address)
|
|||||||
snprintf(port_str, sizeof(port_str), "%d", port);
|
snprintf(port_str, sizeof(port_str), "%d", port);
|
||||||
port_str[sizeof(port_str) - 1] = '\0';
|
port_str[sizeof(port_str) - 1] = '\0';
|
||||||
|
|
||||||
frr_elevate_privs(&bgpd_privs) {
|
frr_with_privs(&bgpd_privs) {
|
||||||
ret = vrf_getaddrinfo(address, port_str, &req, &ainfo_save,
|
ret = vrf_getaddrinfo(address, port_str, &req, &ainfo_save,
|
||||||
bgp->vrf_id);
|
bgp->vrf_id);
|
||||||
}
|
}
|
||||||
@ -788,7 +786,7 @@ int bgp_socket(struct bgp *bgp, unsigned short port, const char *address)
|
|||||||
if (ainfo->ai_family != AF_INET && ainfo->ai_family != AF_INET6)
|
if (ainfo->ai_family != AF_INET && ainfo->ai_family != AF_INET6)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
frr_elevate_privs(&bgpd_privs) {
|
frr_with_privs(&bgpd_privs) {
|
||||||
sock = vrf_socket(ainfo->ai_family,
|
sock = vrf_socket(ainfo->ai_family,
|
||||||
ainfo->ai_socktype,
|
ainfo->ai_socktype,
|
||||||
ainfo->ai_protocol, bgp->vrf_id,
|
ainfo->ai_protocol, bgp->vrf_id,
|
||||||
|
@ -61,7 +61,7 @@ int eigrp_sock_init(struct vrf *vrf)
|
|||||||
int hincl = 1;
|
int hincl = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
frr_elevate_privs(&eigrpd_privs) {
|
frr_with_privs(&eigrpd_privs) {
|
||||||
eigrp_sock = vrf_socket(
|
eigrp_sock = vrf_socket(
|
||||||
AF_INET, SOCK_RAW, IPPROTO_EIGRPIGP, vrf->vrf_id,
|
AF_INET, SOCK_RAW, IPPROTO_EIGRPIGP, vrf->vrf_id,
|
||||||
vrf->vrf_id != VRF_DEFAULT ? vrf->name : NULL);
|
vrf->vrf_id != VRF_DEFAULT ? vrf->name : NULL);
|
||||||
|
@ -187,7 +187,7 @@ int isis_sock_init(struct isis_circuit *circuit)
|
|||||||
{
|
{
|
||||||
int retval = ISIS_OK;
|
int retval = ISIS_OK;
|
||||||
|
|
||||||
frr_elevate_privs(&isisd_privs) {
|
frr_with_privs(&isisd_privs) {
|
||||||
|
|
||||||
retval = open_bpf_dev(circuit);
|
retval = open_bpf_dev(circuit);
|
||||||
|
|
||||||
|
@ -467,7 +467,7 @@ int isis_sock_init(struct isis_circuit *circuit)
|
|||||||
{
|
{
|
||||||
int retval = ISIS_OK;
|
int retval = ISIS_OK;
|
||||||
|
|
||||||
frr_elevate_privs(&isisd_privs) {
|
frr_with_privs(&isisd_privs) {
|
||||||
|
|
||||||
retval = open_dlpi_dev(circuit);
|
retval = open_dlpi_dev(circuit);
|
||||||
|
|
||||||
|
@ -183,7 +183,7 @@ int isis_sock_init(struct isis_circuit *circuit)
|
|||||||
{
|
{
|
||||||
int retval = ISIS_OK;
|
int retval = ISIS_OK;
|
||||||
|
|
||||||
frr_elevate_privs(&isisd_privs) {
|
frr_with_privs(&isisd_privs) {
|
||||||
|
|
||||||
retval = open_packet_socket(circuit);
|
retval = open_packet_socket(circuit);
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ ldp_create_socket(int af, enum socket_type type)
|
|||||||
sock_set_bindany(fd, 1);
|
sock_set_bindany(fd, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
frr_elevate_privs(&ldpd_privs) {
|
frr_with_privs(&ldpd_privs) {
|
||||||
if (sock_set_reuse(fd, 1) == -1) {
|
if (sock_set_reuse(fd, 1) == -1) {
|
||||||
close(fd);
|
close(fd);
|
||||||
return (-1);
|
return (-1);
|
||||||
@ -254,7 +254,7 @@ int
|
|||||||
sock_set_bindany(int fd, int enable)
|
sock_set_bindany(int fd, int enable)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_SO_BINDANY
|
#ifdef HAVE_SO_BINDANY
|
||||||
frr_elevate_privs(&ldpd_privs) {
|
frr_with_privs(&ldpd_privs) {
|
||||||
if (setsockopt(fd, SOL_SOCKET, SO_BINDANY, &enable,
|
if (setsockopt(fd, SOL_SOCKET, SO_BINDANY, &enable,
|
||||||
sizeof(int)) < 0) {
|
sizeof(int)) < 0) {
|
||||||
log_warn("%s: error setting SO_BINDANY", __func__);
|
log_warn("%s: error setting SO_BINDANY", __func__);
|
||||||
@ -269,7 +269,7 @@ sock_set_bindany(int fd, int enable)
|
|||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
#elif defined(IP_BINDANY)
|
#elif defined(IP_BINDANY)
|
||||||
frr_elevate_privs(&ldpd_privs) {
|
frr_with_privs(&ldpd_privs) {
|
||||||
if (setsockopt(fd, IPPROTO_IP, IP_BINDANY, &enable, sizeof(int))
|
if (setsockopt(fd, IPPROTO_IP, IP_BINDANY, &enable, sizeof(int))
|
||||||
< 0) {
|
< 0) {
|
||||||
log_warn("%s: error setting IP_BINDANY", __func__);
|
log_warn("%s: error setting IP_BINDANY", __func__);
|
||||||
@ -304,7 +304,7 @@ sock_set_md5sig(int fd, int af, union ldpd_addr *addr, const char *password)
|
|||||||
#if HAVE_DECL_TCP_MD5SIG
|
#if HAVE_DECL_TCP_MD5SIG
|
||||||
addr2sa(af, addr, 0, &su);
|
addr2sa(af, addr, 0, &su);
|
||||||
|
|
||||||
frr_elevate_privs(&ldpe_privs) {
|
frr_with_privs(&ldpe_privs) {
|
||||||
ret = sockopt_tcp_signature(fd, &su, password);
|
ret = sockopt_tcp_signature(fd, &su, password);
|
||||||
save_errno = errno;
|
save_errno = errno;
|
||||||
}
|
}
|
||||||
|
@ -109,16 +109,16 @@ extern void zprivs_get_ids(struct zprivs_ids_t *);
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Wrapper around zprivs, to be used as:
|
* Wrapper around zprivs, to be used as:
|
||||||
* frr_elevate_privs(&privs) {
|
* frr_with_privs(&privs) {
|
||||||
* ... code ...
|
* ... code ...
|
||||||
* if (error)
|
* if (error)
|
||||||
* break; -- break can be used to get out of the block
|
* break; -- break can be used to get out of the block
|
||||||
* ... code ...
|
* ... code ...
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* The argument to frr_elevate_privs() can be NULL to leave privileges as-is
|
* The argument to frr_with_privs() can be NULL to leave privileges as-is
|
||||||
* (mostly useful for conditional privilege-raising, i.e.:)
|
* (mostly useful for conditional privilege-raising, i.e.:)
|
||||||
* frr_elevate_privs(cond ? &privs : NULL) {}
|
* frr_with_privs(cond ? &privs : NULL) {}
|
||||||
*
|
*
|
||||||
* NB: The code block is always executed, regardless of whether privileges
|
* NB: The code block is always executed, regardless of whether privileges
|
||||||
* could be raised or not, or whether NULL was given or not. This is fully
|
* could be raised or not, or whether NULL was given or not. This is fully
|
||||||
@ -138,7 +138,7 @@ extern struct zebra_privs_t *_zprivs_raise(struct zebra_privs_t *privs,
|
|||||||
const char *funcname);
|
const char *funcname);
|
||||||
extern void _zprivs_lower(struct zebra_privs_t **privs);
|
extern void _zprivs_lower(struct zebra_privs_t **privs);
|
||||||
|
|
||||||
#define frr_elevate_privs(privs) \
|
#define frr_with_privs(privs) \
|
||||||
for (struct zebra_privs_t *_once = NULL, \
|
for (struct zebra_privs_t *_once = NULL, \
|
||||||
*_privs __attribute__( \
|
*_privs __attribute__( \
|
||||||
(unused, cleanup(_zprivs_lower))) = \
|
(unused, cleanup(_zprivs_lower))) = \
|
||||||
|
@ -755,7 +755,7 @@ DEFUN_NOSH (vrf_netns,
|
|||||||
if (!pathname)
|
if (!pathname)
|
||||||
return CMD_WARNING_CONFIG_FAILED;
|
return CMD_WARNING_CONFIG_FAILED;
|
||||||
|
|
||||||
frr_elevate_privs(vrf_daemon_privs) {
|
frr_with_privs(vrf_daemon_privs) {
|
||||||
ret = vrf_netns_handler_create(vty, vrf, pathname,
|
ret = vrf_netns_handler_create(vty, vrf, pathname,
|
||||||
NS_UNKNOWN, NS_UNKNOWN);
|
NS_UNKNOWN, NS_UNKNOWN);
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ void ospf6_serv_close(void)
|
|||||||
/* Make ospf6d's server socket. */
|
/* Make ospf6d's server socket. */
|
||||||
int ospf6_serv_sock(void)
|
int ospf6_serv_sock(void)
|
||||||
{
|
{
|
||||||
frr_elevate_privs(&ospf6d_privs) {
|
frr_with_privs(&ospf6d_privs) {
|
||||||
|
|
||||||
ospf6_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_OSPFIGP);
|
ospf6_sock = socket(AF_INET6, SOCK_RAW, IPPROTO_OSPFIGP);
|
||||||
if (ospf6_sock < 0) {
|
if (ospf6_sock < 0) {
|
||||||
|
@ -190,7 +190,7 @@ int ospf_sock_init(struct ospf *ospf)
|
|||||||
/* silently return since VRF is not ready */
|
/* silently return since VRF is not ready */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
frr_elevate_privs(&ospfd_privs) {
|
frr_with_privs(&ospfd_privs) {
|
||||||
ospf_sock = vrf_socket(AF_INET, SOCK_RAW, IPPROTO_OSPFIGP,
|
ospf_sock = vrf_socket(AF_INET, SOCK_RAW, IPPROTO_OSPFIGP,
|
||||||
ospf->vrf_id, ospf->name);
|
ospf->vrf_id, ospf->name);
|
||||||
if (ospf_sock < 0) {
|
if (ospf_sock < 0) {
|
||||||
|
@ -2097,7 +2097,7 @@ static int ospf_vrf_enable(struct vrf *vrf)
|
|||||||
old_vrf_id);
|
old_vrf_id);
|
||||||
|
|
||||||
if (old_vrf_id != ospf->vrf_id) {
|
if (old_vrf_id != ospf->vrf_id) {
|
||||||
frr_elevate_privs(&ospfd_privs) {
|
frr_with_privs(&ospfd_privs) {
|
||||||
/* stop zebra redist to us for old vrf */
|
/* stop zebra redist to us for old vrf */
|
||||||
zclient_send_dereg_requests(zclient,
|
zclient_send_dereg_requests(zclient,
|
||||||
old_vrf_id);
|
old_vrf_id);
|
||||||
|
@ -57,7 +57,7 @@ static int pim_mroute_set(struct pim_instance *pim, int enable)
|
|||||||
* We need to create the VRF table for the pim mroute_socket
|
* We need to create the VRF table for the pim mroute_socket
|
||||||
*/
|
*/
|
||||||
if (pim->vrf_id != VRF_DEFAULT) {
|
if (pim->vrf_id != VRF_DEFAULT) {
|
||||||
frr_elevate_privs(&pimd_privs) {
|
frr_with_privs(&pimd_privs) {
|
||||||
|
|
||||||
data = pim->vrf->data.l.table_id;
|
data = pim->vrf->data.l.table_id;
|
||||||
err = setsockopt(pim->mroute_socket, IPPROTO_IP,
|
err = setsockopt(pim->mroute_socket, IPPROTO_IP,
|
||||||
@ -75,7 +75,7 @@ static int pim_mroute_set(struct pim_instance *pim, int enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
frr_elevate_privs(&pimd_privs) {
|
frr_with_privs(&pimd_privs) {
|
||||||
opt = enable ? MRT_INIT : MRT_DONE;
|
opt = enable ? MRT_INIT : MRT_DONE;
|
||||||
/*
|
/*
|
||||||
* *BSD *cares* about what value we pass down
|
* *BSD *cares* about what value we pass down
|
||||||
@ -735,7 +735,7 @@ int pim_mroute_socket_enable(struct pim_instance *pim)
|
|||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
frr_elevate_privs(&pimd_privs) {
|
frr_with_privs(&pimd_privs) {
|
||||||
|
|
||||||
fd = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP);
|
fd = socket(AF_INET, SOCK_RAW, IPPROTO_IGMP);
|
||||||
|
|
||||||
|
@ -175,7 +175,7 @@ int pim_msdp_sock_listen(struct pim_instance *pim)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
frr_elevate_privs(&pimd_privs) {
|
frr_with_privs(&pimd_privs) {
|
||||||
/* bind to well known TCP port */
|
/* bind to well known TCP port */
|
||||||
rc = bind(sock, (struct sockaddr *)&sin, socklen);
|
rc = bind(sock, (struct sockaddr *)&sin, socklen);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ int pim_socket_raw(int protocol)
|
|||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
frr_elevate_privs(&pimd_privs) {
|
frr_with_privs(&pimd_privs) {
|
||||||
|
|
||||||
fd = socket(AF_INET, SOCK_RAW, protocol);
|
fd = socket(AF_INET, SOCK_RAW, protocol);
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ void pim_socket_ip_hdr(int fd)
|
|||||||
{
|
{
|
||||||
const int on = 1;
|
const int on = 1;
|
||||||
|
|
||||||
frr_elevate_privs(&pimd_privs) {
|
frr_with_privs(&pimd_privs) {
|
||||||
|
|
||||||
if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)))
|
if (setsockopt(fd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)))
|
||||||
zlog_err("%s: Could not turn on IP_HDRINCL option: %s",
|
zlog_err("%s: Could not turn on IP_HDRINCL option: %s",
|
||||||
@ -83,7 +83,7 @@ int pim_socket_bind(int fd, struct interface *ifp)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
#ifdef SO_BINDTODEVICE
|
#ifdef SO_BINDTODEVICE
|
||||||
|
|
||||||
frr_elevate_privs(&pimd_privs) {
|
frr_with_privs(&pimd_privs) {
|
||||||
|
|
||||||
ret = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifp->name,
|
ret = setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, ifp->name,
|
||||||
strlen(ifp->name));
|
strlen(ifp->name));
|
||||||
|
@ -1395,7 +1395,7 @@ int rip_create_socket(struct vrf *vrf)
|
|||||||
/* Make datagram socket. */
|
/* Make datagram socket. */
|
||||||
if (vrf->vrf_id != VRF_DEFAULT)
|
if (vrf->vrf_id != VRF_DEFAULT)
|
||||||
vrf_dev = vrf->name;
|
vrf_dev = vrf->name;
|
||||||
frr_elevate_privs(&ripd_privs) {
|
frr_with_privs(&ripd_privs) {
|
||||||
sock = vrf_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, vrf->vrf_id,
|
sock = vrf_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP, vrf->vrf_id,
|
||||||
vrf_dev);
|
vrf_dev);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
@ -1415,7 +1415,7 @@ int rip_create_socket(struct vrf *vrf)
|
|||||||
#endif
|
#endif
|
||||||
setsockopt_so_recvbuf(sock, RIP_UDP_RCV_BUF);
|
setsockopt_so_recvbuf(sock, RIP_UDP_RCV_BUF);
|
||||||
|
|
||||||
frr_elevate_privs(&ripd_privs) {
|
frr_with_privs(&ripd_privs) {
|
||||||
if ((ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)))
|
if ((ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)))
|
||||||
< 0) {
|
< 0) {
|
||||||
zlog_err("%s: Can't bind socket %d to %s port %d: %s",
|
zlog_err("%s: Can't bind socket %d to %s port %d: %s",
|
||||||
|
@ -75,7 +75,7 @@ static int ripng_multicast_join(struct interface *ifp, int sock)
|
|||||||
* While this is bogus, privs are available and easy to use
|
* While this is bogus, privs are available and easy to use
|
||||||
* for this call as a workaround.
|
* for this call as a workaround.
|
||||||
*/
|
*/
|
||||||
frr_elevate_privs(&ripngd_privs) {
|
frr_with_privs(&ripngd_privs) {
|
||||||
|
|
||||||
ret = setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP,
|
ret = setsockopt(sock, IPPROTO_IPV6, IPV6_JOIN_GROUP,
|
||||||
(char *)&mreq, sizeof(mreq));
|
(char *)&mreq, sizeof(mreq));
|
||||||
|
@ -120,8 +120,7 @@ int ripng_make_socket(struct vrf *vrf)
|
|||||||
/* Make datagram socket. */
|
/* Make datagram socket. */
|
||||||
if (vrf->vrf_id != VRF_DEFAULT)
|
if (vrf->vrf_id != VRF_DEFAULT)
|
||||||
vrf_dev = vrf->name;
|
vrf_dev = vrf->name;
|
||||||
frr_elevate_privs(&ripngd_privs)
|
frr_with_privs(&ripngd_privs) {
|
||||||
{
|
|
||||||
sock = vrf_socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP,
|
sock = vrf_socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP,
|
||||||
vrf->vrf_id, vrf_dev);
|
vrf->vrf_id, vrf_dev);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
@ -160,7 +159,7 @@ int ripng_make_socket(struct vrf *vrf)
|
|||||||
#endif /* SIN6_LEN */
|
#endif /* SIN6_LEN */
|
||||||
ripaddr.sin6_port = htons(RIPNG_PORT_DEFAULT);
|
ripaddr.sin6_port = htons(RIPNG_PORT_DEFAULT);
|
||||||
|
|
||||||
frr_elevate_privs(&ripngd_privs) {
|
frr_with_privs(&ripngd_privs) {
|
||||||
ret = bind(sock, (struct sockaddr *)&ripaddr, sizeof(ripaddr));
|
ret = bind(sock, (struct sockaddr *)&ripaddr, sizeof(ripaddr));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
zlog_err("Can't bind ripng socket: %s.",
|
zlog_err("Can't bind ripng socket: %s.",
|
||||||
|
@ -113,7 +113,7 @@ int main(int argc, char **argv)
|
|||||||
((test_privs.current_state() == ZPRIVS_RAISED) ? "Raised" : "Lowered")
|
((test_privs.current_state() == ZPRIVS_RAISED) ? "Raised" : "Lowered")
|
||||||
|
|
||||||
printf("%s\n", PRIV_STATE());
|
printf("%s\n", PRIV_STATE());
|
||||||
frr_elevate_privs(&test_privs) {
|
frr_with_privs(&test_privs) {
|
||||||
printf("%s\n", PRIV_STATE());
|
printf("%s\n", PRIV_STATE());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ int main(int argc, char **argv)
|
|||||||
|
|
||||||
/* but these should continue to work... */
|
/* but these should continue to work... */
|
||||||
printf("%s\n", PRIV_STATE());
|
printf("%s\n", PRIV_STATE());
|
||||||
frr_elevate_privs(&test_privs) {
|
frr_with_privs(&test_privs) {
|
||||||
printf("%s\n", PRIV_STATE());
|
printf("%s\n", PRIV_STATE());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
identifier change;
|
identifier change;
|
||||||
identifier end;
|
identifier end;
|
||||||
expression E, f, g;
|
expression E, f, g;
|
||||||
iterator name frr_elevate_privs;
|
iterator name frr_with_privs;
|
||||||
@@
|
@@
|
||||||
|
|
||||||
- if (E.change(ZPRIVS_RAISE))
|
- if (E.change(ZPRIVS_RAISE))
|
||||||
- f;
|
- f;
|
||||||
+ frr_elevate_privs(&E) {
|
+ frr_with_privs(&E) {
|
||||||
<+...
|
<+...
|
||||||
- goto end;
|
- goto end;
|
||||||
+ break;
|
+ break;
|
||||||
@ -20,7 +20,7 @@ iterator name frr_elevate_privs;
|
|||||||
@@
|
@@
|
||||||
identifier change, errno, safe_strerror, exit;
|
identifier change, errno, safe_strerror, exit;
|
||||||
expression E, f1, f2, f3, ret, fn;
|
expression E, f1, f2, f3, ret, fn;
|
||||||
iterator name frr_elevate_privs;
|
iterator name frr_with_privs;
|
||||||
@@
|
@@
|
||||||
|
|
||||||
if (E.change(ZPRIVS_RAISE))
|
if (E.change(ZPRIVS_RAISE))
|
||||||
@ -44,7 +44,7 @@ iterator name frr_elevate_privs;
|
|||||||
@@
|
@@
|
||||||
identifier change;
|
identifier change;
|
||||||
expression E, f1, f2, f3, ret;
|
expression E, f1, f2, f3, ret;
|
||||||
iterator name frr_elevate_privs;
|
iterator name frr_with_privs;
|
||||||
@@
|
@@
|
||||||
|
|
||||||
if (E.change(ZPRIVS_RAISE))
|
if (E.change(ZPRIVS_RAISE))
|
||||||
@ -64,12 +64,12 @@ iterator name frr_elevate_privs;
|
|||||||
@@
|
@@
|
||||||
identifier change;
|
identifier change;
|
||||||
expression E, f, g;
|
expression E, f, g;
|
||||||
iterator name frr_elevate_privs;
|
iterator name frr_with_privs;
|
||||||
@@
|
@@
|
||||||
|
|
||||||
- if (E.change(ZPRIVS_RAISE))
|
- if (E.change(ZPRIVS_RAISE))
|
||||||
- f;
|
- f;
|
||||||
+ frr_elevate_privs(&E) {
|
+ frr_with_privs(&E) {
|
||||||
...
|
...
|
||||||
- if (E.change(ZPRIVS_LOWER))
|
- if (E.change(ZPRIVS_LOWER))
|
||||||
- g;
|
- g;
|
||||||
|
@ -1065,8 +1065,7 @@ static int vrrp_socket(struct vrrp_router *r)
|
|||||||
int ret;
|
int ret;
|
||||||
bool failed = false;
|
bool failed = false;
|
||||||
|
|
||||||
frr_elevate_privs(&vrrp_privs)
|
frr_with_privs(&vrrp_privs) {
|
||||||
{
|
|
||||||
r->sock_rx = socket(r->family, SOCK_RAW, IPPROTO_VRRP);
|
r->sock_rx = socket(r->family, SOCK_RAW, IPPROTO_VRRP);
|
||||||
r->sock_tx = socket(r->family, SOCK_RAW, IPPROTO_VRRP);
|
r->sock_tx = socket(r->family, SOCK_RAW, IPPROTO_VRRP);
|
||||||
}
|
}
|
||||||
@ -1102,8 +1101,7 @@ static int vrrp_socket(struct vrrp_router *r)
|
|||||||
setsockopt_ipv4_multicast_loop(r->sock_tx, 0);
|
setsockopt_ipv4_multicast_loop(r->sock_tx, 0);
|
||||||
|
|
||||||
/* Bind Rx socket to exact interface */
|
/* Bind Rx socket to exact interface */
|
||||||
frr_elevate_privs(&vrrp_privs)
|
frr_with_privs(&vrrp_privs) {
|
||||||
{
|
|
||||||
ret = setsockopt(r->sock_rx, SOL_SOCKET,
|
ret = setsockopt(r->sock_rx, SOL_SOCKET,
|
||||||
SO_BINDTODEVICE, r->vr->ifp->name,
|
SO_BINDTODEVICE, r->vr->ifp->name,
|
||||||
strlen(r->vr->ifp->name));
|
strlen(r->vr->ifp->name));
|
||||||
@ -1213,8 +1211,7 @@ static int vrrp_socket(struct vrrp_router *r)
|
|||||||
setsockopt_ipv6_multicast_loop(r->sock_tx, 0);
|
setsockopt_ipv6_multicast_loop(r->sock_tx, 0);
|
||||||
|
|
||||||
/* Bind Rx socket to exact interface */
|
/* Bind Rx socket to exact interface */
|
||||||
frr_elevate_privs(&vrrp_privs)
|
frr_with_privs(&vrrp_privs) {
|
||||||
{
|
|
||||||
ret = setsockopt(r->sock_rx, SOL_SOCKET,
|
ret = setsockopt(r->sock_rx, SOL_SOCKET,
|
||||||
SO_BINDTODEVICE, r->vr->ifp->name,
|
SO_BINDTODEVICE, r->vr->ifp->name,
|
||||||
strlen(r->vr->ifp->name));
|
strlen(r->vr->ifp->name));
|
||||||
|
@ -188,7 +188,7 @@ void vrrp_garp_init(void)
|
|||||||
/* Create the socket descriptor */
|
/* Create the socket descriptor */
|
||||||
/* FIXME: why ETH_P_RARP? */
|
/* FIXME: why ETH_P_RARP? */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
frr_elevate_privs(&vrrp_privs) {
|
frr_with_privs(&vrrp_privs) {
|
||||||
garp_fd = socket(PF_PACKET, SOCK_RAW | SOCK_CLOEXEC,
|
garp_fd = socket(PF_PACKET, SOCK_RAW | SOCK_CLOEXEC,
|
||||||
htons(ETH_P_RARP));
|
htons(ETH_P_RARP));
|
||||||
}
|
}
|
||||||
|
@ -214,8 +214,7 @@ int vrrp_ndisc_una_send_all(struct vrrp_router *r)
|
|||||||
|
|
||||||
void vrrp_ndisc_init(void)
|
void vrrp_ndisc_init(void)
|
||||||
{
|
{
|
||||||
frr_elevate_privs(&vrrp_privs)
|
frr_with_privs(&vrrp_privs) {
|
||||||
{
|
|
||||||
ndisc_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6));
|
ndisc_fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_IPV6));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ static int interface_list_ioctl(int af)
|
|||||||
size_t needed, lastneeded = 0;
|
size_t needed, lastneeded = 0;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
sock = socket(af, SOCK_DGRAM, 0);
|
sock = socket(af, SOCK_DGRAM, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,7 +72,7 @@ static int interface_list_ioctl(int af)
|
|||||||
}
|
}
|
||||||
|
|
||||||
calculate_lifc_len:
|
calculate_lifc_len:
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
lifn.lifn_family = af;
|
lifn.lifn_family = af;
|
||||||
lifn.lifn_flags = LIFC_NOXMIT;
|
lifn.lifn_flags = LIFC_NOXMIT;
|
||||||
/* we want NOXMIT interfaces too */
|
/* we want NOXMIT interfaces too */
|
||||||
@ -107,7 +107,7 @@ calculate_lifc_len:
|
|||||||
lifconf.lifc_len = needed;
|
lifconf.lifc_len = needed;
|
||||||
lifconf.lifc_buf = buf;
|
lifconf.lifc_buf = buf;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ret = ioctl(sock, SIOCGLIFCONF, &lifconf);
|
ret = ioctl(sock, SIOCGLIFCONF, &lifconf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -385,7 +385,7 @@ static int get_iflink_speed(struct interface *interface)
|
|||||||
ifdata.ifr_data = (caddr_t)&ecmd;
|
ifdata.ifr_data = (caddr_t)&ecmd;
|
||||||
|
|
||||||
/* use ioctl to get IP address of an interface */
|
/* use ioctl to get IP address of an interface */
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
sd = vrf_socket(PF_INET, SOCK_DGRAM, IPPROTO_IP,
|
sd = vrf_socket(PF_INET, SOCK_DGRAM, IPPROTO_IP,
|
||||||
interface->vrf_id,
|
interface->vrf_id,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -57,7 +57,7 @@ int if_ioctl(unsigned long request, caddr_t buffer)
|
|||||||
int ret;
|
int ret;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
zlog_err("Cannot create UDP socket: %s",
|
zlog_err("Cannot create UDP socket: %s",
|
||||||
@ -83,7 +83,7 @@ int vrf_if_ioctl(unsigned long request, caddr_t buffer, vrf_id_t vrf_id)
|
|||||||
int ret;
|
int ret;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
sock = vrf_socket(AF_INET, SOCK_DGRAM, 0, vrf_id, NULL);
|
sock = vrf_socket(AF_INET, SOCK_DGRAM, 0, vrf_id, NULL);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
zlog_err("Cannot create UDP socket: %s",
|
zlog_err("Cannot create UDP socket: %s",
|
||||||
@ -110,7 +110,7 @@ static int if_ioctl_ipv6(unsigned long request, caddr_t buffer)
|
|||||||
int ret;
|
int ret;
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
sock = socket(AF_INET6, SOCK_DGRAM, 0);
|
sock = socket(AF_INET6, SOCK_DGRAM, 0);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
zlog_err("Cannot create IPv6 datagram socket: %s",
|
zlog_err("Cannot create IPv6 datagram socket: %s",
|
||||||
|
@ -66,7 +66,7 @@ int if_ioctl(unsigned long request, caddr_t buffer)
|
|||||||
int ret;
|
int ret;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
sock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
@ -96,7 +96,7 @@ int if_ioctl_ipv6(unsigned long request, caddr_t buffer)
|
|||||||
int ret;
|
int ret;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
sock = socket(AF_INET6, SOCK_DGRAM, 0);
|
sock = socket(AF_INET6, SOCK_DGRAM, 0);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
|
@ -76,7 +76,7 @@ int ipforward_on(void)
|
|||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
fp = fopen(proc_ipv4_forwarding, "w");
|
fp = fopen(proc_ipv4_forwarding, "w");
|
||||||
|
|
||||||
@ -97,7 +97,7 @@ int ipforward_off(void)
|
|||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
fp = fopen(proc_ipv4_forwarding, "w");
|
fp = fopen(proc_ipv4_forwarding, "w");
|
||||||
|
|
||||||
@ -143,7 +143,7 @@ int ipforward_ipv6_on(void)
|
|||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
fp = fopen(proc_ipv6_forwarding, "w");
|
fp = fopen(proc_ipv6_forwarding, "w");
|
||||||
|
|
||||||
@ -165,7 +165,7 @@ int ipforward_ipv6_off(void)
|
|||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
fp = fopen(proc_ipv6_forwarding, "w");
|
fp = fopen(proc_ipv6_forwarding, "w");
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ static int solaris_nd(const int cmd, const char *parameter, const int value)
|
|||||||
strioctl.ic_len = ND_BUFFER_SIZE;
|
strioctl.ic_len = ND_BUFFER_SIZE;
|
||||||
strioctl.ic_dp = nd_buf;
|
strioctl.ic_dp = nd_buf;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
if ((fd = open(device, O_RDWR)) < 0) {
|
if ((fd = open(device, O_RDWR)) < 0) {
|
||||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||||
"failed to open device %s - %s", device,
|
"failed to open device %s - %s", device,
|
||||||
|
@ -56,7 +56,7 @@ int ipforward_on(void)
|
|||||||
int ipforwarding = 1;
|
int ipforwarding = 1;
|
||||||
|
|
||||||
len = sizeof ipforwarding;
|
len = sizeof ipforwarding;
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
|
if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
|
||||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||||
"Can't set ipforwarding on");
|
"Can't set ipforwarding on");
|
||||||
@ -72,7 +72,7 @@ int ipforward_off(void)
|
|||||||
int ipforwarding = 0;
|
int ipforwarding = 0;
|
||||||
|
|
||||||
len = sizeof ipforwarding;
|
len = sizeof ipforwarding;
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
|
if (sysctl(mib, MIB_SIZ, NULL, NULL, &ipforwarding, len) < 0) {
|
||||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||||
"Can't set ipforwarding on");
|
"Can't set ipforwarding on");
|
||||||
@ -97,7 +97,7 @@ int ipforward_ipv6(void)
|
|||||||
int ip6forwarding = 0;
|
int ip6forwarding = 0;
|
||||||
|
|
||||||
len = sizeof ip6forwarding;
|
len = sizeof ip6forwarding;
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
if (sysctl(mib_ipv6, MIB_SIZ, &ip6forwarding, &len, 0, 0) < 0) {
|
if (sysctl(mib_ipv6, MIB_SIZ, &ip6forwarding, &len, 0, 0) < 0) {
|
||||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||||
"can't get ip6forwarding value");
|
"can't get ip6forwarding value");
|
||||||
@ -113,7 +113,7 @@ int ipforward_ipv6_on(void)
|
|||||||
int ip6forwarding = 1;
|
int ip6forwarding = 1;
|
||||||
|
|
||||||
len = sizeof ip6forwarding;
|
len = sizeof ip6forwarding;
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
|
if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
|
||||||
< 0) {
|
< 0) {
|
||||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||||
@ -130,7 +130,7 @@ int ipforward_ipv6_off(void)
|
|||||||
int ip6forwarding = 0;
|
int ip6forwarding = 0;
|
||||||
|
|
||||||
len = sizeof ip6forwarding;
|
len = sizeof ip6forwarding;
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
|
if (sysctl(mib_ipv6, MIB_SIZ, NULL, NULL, &ip6forwarding, len)
|
||||||
< 0) {
|
< 0) {
|
||||||
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
flog_err_sys(EC_LIB_SYSTEM_CALL,
|
||||||
|
@ -82,7 +82,7 @@ int irdp_sock_init(void)
|
|||||||
int save_errno;
|
int save_errno;
|
||||||
int sock;
|
int sock;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
|
||||||
save_errno = errno;
|
save_errno = errno;
|
||||||
|
@ -183,7 +183,7 @@ static int netlink_recvbuf(struct nlsock *nl, uint32_t newsize)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Try force option (linux >= 2.6.14) and fall back to normal set */
|
/* Try force option (linux >= 2.6.14) and fall back to normal set */
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ret = setsockopt(nl->sock, SOL_SOCKET, SO_RCVBUFFORCE,
|
ret = setsockopt(nl->sock, SOL_SOCKET, SO_RCVBUFFORCE,
|
||||||
&nl_rcvbufsize,
|
&nl_rcvbufsize,
|
||||||
sizeof(nl_rcvbufsize));
|
sizeof(nl_rcvbufsize));
|
||||||
@ -220,7 +220,7 @@ static int netlink_socket(struct nlsock *nl, unsigned long groups,
|
|||||||
int sock;
|
int sock;
|
||||||
int namelen;
|
int namelen;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
sock = ns_socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE, ns_id);
|
sock = ns_socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE, ns_id);
|
||||||
if (sock < 0) {
|
if (sock < 0) {
|
||||||
zlog_err("Can't open %s socket: %s", nl->name,
|
zlog_err("Can't open %s socket: %s", nl->name,
|
||||||
@ -352,7 +352,7 @@ static void netlink_write_incoming(const char *buf, const unsigned int size,
|
|||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
snprintf(fname, MAXPATHLEN, "%s/%s_%u", frr_vtydir, "netlink", counter);
|
snprintf(fname, MAXPATHLEN, "%s/%s_%u", frr_vtydir, "netlink", counter);
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
f = fopen(fname, "w");
|
f = fopen(fname, "w");
|
||||||
}
|
}
|
||||||
if (f) {
|
if (f) {
|
||||||
@ -373,7 +373,7 @@ static long netlink_read_file(char *buf, const char *fname)
|
|||||||
FILE *f;
|
FILE *f;
|
||||||
long file_bytes = -1;
|
long file_bytes = -1;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
f = fopen(fname, "r");
|
f = fopen(fname, "r");
|
||||||
}
|
}
|
||||||
if (f) {
|
if (f) {
|
||||||
@ -989,7 +989,7 @@ int netlink_talk_info(int (*filter)(struct nlmsghdr *, ns_id_t, int startup),
|
|||||||
n->nlmsg_flags);
|
n->nlmsg_flags);
|
||||||
|
|
||||||
/* Send message to netlink interface. */
|
/* Send message to netlink interface. */
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
status = sendmsg(nl->sock, &msg, 0);
|
status = sendmsg(nl->sock, &msg, 0);
|
||||||
save_errno = errno;
|
save_errno = errno;
|
||||||
}
|
}
|
||||||
@ -1056,7 +1056,7 @@ int netlink_request(struct nlsock *nl, struct nlmsghdr *n)
|
|||||||
snl.nl_family = AF_NETLINK;
|
snl.nl_family = AF_NETLINK;
|
||||||
|
|
||||||
/* Raise capabilities and send message, then lower capabilities. */
|
/* Raise capabilities and send message, then lower capabilities. */
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ret = sendto(nl->sock, (void *)n, n->nlmsg_len, 0,
|
ret = sendto(nl->sock, (void *)n, n->nlmsg_len, 0,
|
||||||
(struct sockaddr *)&snl, sizeof snl);
|
(struct sockaddr *)&snl, sizeof snl);
|
||||||
}
|
}
|
||||||
|
@ -1426,7 +1426,7 @@ static int kernel_read(struct thread *thread)
|
|||||||
/* Make routing socket. */
|
/* Make routing socket. */
|
||||||
static void routing_socket(struct zebra_ns *zns)
|
static void routing_socket(struct zebra_ns *zns)
|
||||||
{
|
{
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
routing_sock = ns_socket(AF_ROUTE, SOCK_RAW, 0, zns->ns_id);
|
routing_sock = ns_socket(AF_ROUTE, SOCK_RAW, 0, zns->ns_id);
|
||||||
|
|
||||||
dplane_routing_sock =
|
dplane_routing_sock =
|
||||||
|
@ -314,7 +314,7 @@ enum zebra_dplane_result kernel_route_update(struct zebra_dplane_ctx *ctx)
|
|||||||
type = dplane_ctx_get_type(ctx);
|
type = dplane_ctx_get_type(ctx);
|
||||||
old_type = dplane_ctx_get_old_type(ctx);
|
old_type = dplane_ctx_get_old_type(ctx);
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
if (dplane_ctx_get_op(ctx) == DPLANE_OP_ROUTE_DELETE) {
|
if (dplane_ctx_get_op(ctx) == DPLANE_OP_ROUTE_DELETE) {
|
||||||
if (!RSYSTEM_ROUTE(type))
|
if (!RSYSTEM_ROUTE(type))
|
||||||
|
@ -760,7 +760,7 @@ static int rtadv_make_socket(ns_id_t ns_id)
|
|||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct icmp6_filter filter;
|
struct icmp6_filter filter;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
|
|
||||||
sock = ns_socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6, ns_id);
|
sock = ns_socket(AF_INET6, SOCK_RAW, IPPROTO_ICMPV6, ns_id);
|
||||||
|
|
||||||
|
@ -2507,7 +2507,7 @@ static void zserv_write_incoming(struct stream *orig, uint16_t command)
|
|||||||
|
|
||||||
snprintf(fname, MAXPATHLEN, "%s/%u", frr_vtydir, command);
|
snprintf(fname, MAXPATHLEN, "%s/%u", frr_vtydir, command);
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
fd = open(fname, O_CREAT | O_WRONLY | O_EXCL, 0644);
|
fd = open(fname, O_CREAT | O_WRONLY | O_EXCL, 0644);
|
||||||
}
|
}
|
||||||
stream_flush(copy, fd);
|
stream_flush(copy, fd);
|
||||||
|
@ -119,7 +119,7 @@ static int kernel_send_rtmsg_v4(int action, mpls_label_t in_label,
|
|||||||
hdr.rtm_mpls = MPLS_OP_SWAP;
|
hdr.rtm_mpls = MPLS_OP_SWAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ret = writev(kr_state.fd, iov, iovcnt);
|
ret = writev(kr_state.fd, iov, iovcnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,7 +226,7 @@ static int kernel_send_rtmsg_v6(int action, mpls_label_t in_label,
|
|||||||
hdr.rtm_mpls = MPLS_OP_SWAP;
|
hdr.rtm_mpls = MPLS_OP_SWAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ret = writev(kr_state.fd, iov, iovcnt);
|
ret = writev(kr_state.fd, iov, iovcnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ static void zebra_ns_notify_create_context_from_entry_name(const char *name)
|
|||||||
if (netnspath == NULL)
|
if (netnspath == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ns_id = zebra_ns_id_get(netnspath);
|
ns_id = zebra_ns_id_get(netnspath);
|
||||||
}
|
}
|
||||||
if (ns_id == NS_UNKNOWN)
|
if (ns_id == NS_UNKNOWN)
|
||||||
@ -97,7 +97,7 @@ static void zebra_ns_notify_create_context_from_entry_name(const char *name)
|
|||||||
ns_map_nsid_with_external(ns_id, false);
|
ns_map_nsid_with_external(ns_id, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ret = vrf_netns_handler_create(NULL, vrf, netnspath,
|
ret = vrf_netns_handler_create(NULL, vrf, netnspath,
|
||||||
ns_id_external, ns_id);
|
ns_id_external, ns_id);
|
||||||
}
|
}
|
||||||
@ -202,14 +202,14 @@ static int zebra_ns_ready_read(struct thread *t)
|
|||||||
netnspath = zns_info->netnspath;
|
netnspath = zns_info->netnspath;
|
||||||
if (--zns_info->retries == 0)
|
if (--zns_info->retries == 0)
|
||||||
stop_retry = 1;
|
stop_retry = 1;
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
err = ns_switch_to_netns(netnspath);
|
err = ns_switch_to_netns(netnspath);
|
||||||
}
|
}
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return zebra_ns_continue_read(zns_info, stop_retry);
|
return zebra_ns_continue_read(zns_info, stop_retry);
|
||||||
|
|
||||||
/* go back to default ns */
|
/* go back to default ns */
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
err = ns_switchback_to_initial();
|
err = ns_switchback_to_initial();
|
||||||
}
|
}
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
@ -180,7 +180,7 @@ int zebra_ns_init(const char *optional_default_name)
|
|||||||
|
|
||||||
dzns = zebra_ns_alloc();
|
dzns = zebra_ns_alloc();
|
||||||
|
|
||||||
frr_elevate_privs(&zserv_privs) {
|
frr_with_privs(&zserv_privs) {
|
||||||
ns_id = zebra_ns_id_get_default();
|
ns_id = zebra_ns_id_get_default();
|
||||||
}
|
}
|
||||||
ns_id_external = ns_map_nsid_with_external(ns_id, true);
|
ns_id_external = ns_map_nsid_with_external(ns_id, true);
|
||||||
|
@ -782,7 +782,7 @@ void zserv_start(char *path)
|
|||||||
setsockopt_so_recvbuf(zsock, 1048576);
|
setsockopt_so_recvbuf(zsock, 1048576);
|
||||||
setsockopt_so_sendbuf(zsock, 1048576);
|
setsockopt_so_sendbuf(zsock, 1048576);
|
||||||
|
|
||||||
frr_elevate_privs((sa.ss_family != AF_UNIX) ? &zserv_privs : NULL) {
|
frr_with_privs((sa.ss_family != AF_UNIX) ? &zserv_privs : NULL) {
|
||||||
ret = bind(zsock, (struct sockaddr *)&sa, sa_len);
|
ret = bind(zsock, (struct sockaddr *)&sa, sa_len);
|
||||||
}
|
}
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user