mirror of
https://github.com/openbsd/src.git
synced 2026-05-01 17:46:35 +00:00
Reduce if_indextoname(3) usage.
There is no need to constantly ask the kernel for the interface name, it is not going to change. We pass the interface name from the frontend to the engine because it is a fixed length string that is only used to find the configuration for the interface and debugging output. We do *not* pass the name to the main process because that would allow the frontend to create arbitrary files inside of /var/db/dhcpleased/, send arbitrary data to the SIOCAIFADDR et. al. ioctls, and mess with the bpf socket. OK tb
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: dhcpleased.h,v 1.17 2024/08/25 09:53:53 florian Exp $ */
|
||||
/* $OpenBSD: dhcpleased.h,v 1.18 2025/09/18 11:37:01 florian Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017, 2021 Florian Obser <florian@openbsd.org>
|
||||
@@ -269,6 +269,7 @@ struct dhcpleased_conf {
|
||||
|
||||
struct imsg_ifinfo {
|
||||
uint32_t if_index;
|
||||
char if_name[IF_NAMESIZE];
|
||||
int rdomain;
|
||||
int running;
|
||||
int link_state;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: engine.c,v 1.58 2025/05/09 19:17:31 florian Exp $ */
|
||||
/* $OpenBSD: engine.c,v 1.59 2025/09/18 11:37:01 florian Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017, 2021 Florian Obser <florian@openbsd.org>
|
||||
@@ -93,6 +93,7 @@ struct dhcpleased_iface {
|
||||
struct event timer;
|
||||
struct timeval timo;
|
||||
uint32_t if_index;
|
||||
char if_name[IF_NAMESIZE];
|
||||
int rdomain;
|
||||
int running;
|
||||
struct ether_addr hw_address;
|
||||
@@ -555,8 +556,6 @@ engine_dispatch_main(int fd, short event, void *bula)
|
||||
struct dhcpleased_iface *iface;
|
||||
int *ifaces;
|
||||
int i, if_index;
|
||||
char *if_name;
|
||||
char ifnamebuf[IF_NAMESIZE];
|
||||
|
||||
if (nconf == NULL)
|
||||
fatalx("%s: %s without IMSG_RECONF_CONF",
|
||||
@@ -567,12 +566,11 @@ engine_dispatch_main(int fd, short event, void *bula)
|
||||
nconf = NULL;
|
||||
for (i = 0; ifaces[i] != 0; i++) {
|
||||
if_index = ifaces[i];
|
||||
if_name = if_indextoname(if_index, ifnamebuf);
|
||||
iface = get_dhcpleased_iface_by_id(if_index);
|
||||
if (if_name == NULL || iface == NULL)
|
||||
if (iface == NULL)
|
||||
continue;
|
||||
iface_conf = find_iface_conf(
|
||||
&engine_conf->iface_list, if_name);
|
||||
&engine_conf->iface_list, iface->if_name);
|
||||
if (iface_conf == NULL)
|
||||
continue;
|
||||
if (iface_conf->ignore & IGN_DNS)
|
||||
@@ -658,6 +656,9 @@ engine_update_iface(struct imsg_ifinfo *imsg_ifinfo)
|
||||
iface->running = imsg_ifinfo->running;
|
||||
iface->link_state = imsg_ifinfo->link_state;
|
||||
iface->requested_ip.s_addr = INADDR_ANY;
|
||||
memcpy(iface->if_name, imsg_ifinfo->if_name,
|
||||
sizeof(iface->if_name));
|
||||
iface->if_name[sizeof(iface->if_name) - 1] = '\0';
|
||||
memcpy(&iface->hw_address, &imsg_ifinfo->hw_address,
|
||||
sizeof(struct ether_addr));
|
||||
LIST_INSERT_HEAD(&dhcpleased_interfaces, iface, entries);
|
||||
@@ -757,15 +758,12 @@ parse_dhcp(struct dhcpleased_iface *iface, struct imsg_dhcp *dhcp)
|
||||
char hbuf[INET_ADDRSTRLEN];
|
||||
char domainname[4 * 255 + 1];
|
||||
char hostname[4 * 255 + 1];
|
||||
char ifnamebuf[IF_NAMESIZE], *if_name;
|
||||
|
||||
if (bcast_mac.ether_addr_octet[0] == 0)
|
||||
memset(bcast_mac.ether_addr_octet, 0xff, ETHER_ADDR_LEN);
|
||||
|
||||
if_name = if_indextoname(iface->if_index, ifnamebuf);
|
||||
|
||||
#ifndef SMALL
|
||||
iface_conf = find_iface_conf(&engine_conf->iface_list, if_name);
|
||||
iface_conf = find_iface_conf(&engine_conf->iface_list, iface->if_name);
|
||||
#endif /* SMALL*/
|
||||
|
||||
memset(hbuf_src, 0, sizeof(hbuf_src));
|
||||
@@ -1224,8 +1222,8 @@ parse_dhcp(struct dhcpleased_iface *iface, struct imsg_dhcp *dhcp)
|
||||
from);
|
||||
|
||||
log_debug("%s on %s from %s/%s to %s/%s",
|
||||
dhcp_message_type2str(dhcp_message_type), if_name == NULL ? "?" :
|
||||
if_name, from, hbuf_src, to, hbuf_dst);
|
||||
dhcp_message_type2str(dhcp_message_type), iface->if_name, from,
|
||||
hbuf_src, to, hbuf_dst);
|
||||
|
||||
switch (dhcp_message_type) {
|
||||
case DHCPOFFER:
|
||||
@@ -1392,7 +1390,6 @@ state_transition(struct dhcpleased_iface *iface, enum if_state new_state)
|
||||
{
|
||||
enum if_state old_state = iface->state;
|
||||
struct timespec now, res;
|
||||
char ifnamebuf[IF_NAMESIZE], *if_name;
|
||||
|
||||
iface->state = new_state;
|
||||
|
||||
@@ -1506,9 +1503,8 @@ state_transition(struct dhcpleased_iface *iface, enum if_state new_state)
|
||||
}
|
||||
}
|
||||
|
||||
if_name = if_indextoname(iface->if_index, ifnamebuf);
|
||||
log_debug("%s[%s] %s -> %s, timo: %lld", __func__, if_name == NULL ?
|
||||
"?" : if_name, if_state_name[old_state], if_state_name[new_state],
|
||||
log_debug("%s[%s] %s -> %s, timo: %lld", __func__, iface->if_name,
|
||||
if_state_name[old_state], if_state_name[new_state],
|
||||
iface->timo.tv_sec);
|
||||
|
||||
if (iface->timo.tv_sec == -1) {
|
||||
@@ -1669,9 +1665,7 @@ void
|
||||
log_lease(struct dhcpleased_iface *iface, int deconfigure)
|
||||
{
|
||||
char hbuf_lease[INET_ADDRSTRLEN], hbuf_server[INET_ADDRSTRLEN];
|
||||
char ifnamebuf[IF_NAMESIZE], *if_name;
|
||||
|
||||
if_name = if_indextoname(iface->if_index, ifnamebuf);
|
||||
inet_ntop(AF_INET, &iface->requested_ip, hbuf_lease,
|
||||
sizeof(hbuf_lease));
|
||||
inet_ntop(AF_INET, &iface->server_identifier, hbuf_server,
|
||||
@@ -1680,10 +1674,10 @@ log_lease(struct dhcpleased_iface *iface, int deconfigure)
|
||||
|
||||
if (deconfigure)
|
||||
log_info("deleting %s from %s (lease from %s)", hbuf_lease,
|
||||
if_name == NULL ? "?" : if_name, hbuf_server);
|
||||
iface->if_name, hbuf_server);
|
||||
else
|
||||
log_info("adding %s to %s (lease from %s)", hbuf_lease,
|
||||
if_name == NULL ? "?" : if_name, hbuf_server);
|
||||
iface->if_name, hbuf_server);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -1783,9 +1777,7 @@ log_rdns(struct dhcpleased_iface *iface, int withdraw)
|
||||
{
|
||||
int i;
|
||||
char hbuf_rdns[INET_ADDRSTRLEN], hbuf_server[INET_ADDRSTRLEN];
|
||||
char ifnamebuf[IF_NAMESIZE], *if_name, *rdns_buf = NULL, *tmp_buf;
|
||||
|
||||
if_name = if_indextoname(iface->if_index, ifnamebuf);
|
||||
char *rdns_buf = NULL, *tmp_buf;
|
||||
|
||||
inet_ntop(AF_INET, &iface->server_identifier, hbuf_server,
|
||||
sizeof(hbuf_server));
|
||||
@@ -1806,12 +1798,10 @@ log_rdns(struct dhcpleased_iface *iface, int withdraw)
|
||||
if (rdns_buf != NULL) {
|
||||
if (withdraw) {
|
||||
log_info("deleting nameservers%s (lease from %s on %s)",
|
||||
rdns_buf, hbuf_server, if_name == NULL ? "?" :
|
||||
if_name);
|
||||
rdns_buf, hbuf_server, iface->if_name);
|
||||
} else {
|
||||
log_info("adding nameservers%s (lease from %s on %s)",
|
||||
rdns_buf, hbuf_server, if_name == NULL ? "?" :
|
||||
if_name);
|
||||
rdns_buf, hbuf_server, iface->if_name);
|
||||
}
|
||||
free(rdns_buf);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* $OpenBSD: frontend.c,v 1.45 2024/11/21 13:35:20 claudio Exp $ */
|
||||
/* $OpenBSD: frontend.c,v 1.46 2025/09/18 11:37:01 florian Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2017, 2021 Florian Obser <florian@openbsd.org>
|
||||
@@ -428,7 +428,6 @@ frontend_dispatch_main(int fd, short event, void *bula)
|
||||
case IMSG_RECONF_END: {
|
||||
int i;
|
||||
int *ifaces;
|
||||
char ifnamebuf[IF_NAMESIZE], *if_name;
|
||||
|
||||
if (nconf == NULL)
|
||||
fatalx("%s: %s without IMSG_RECONF_CONF",
|
||||
@@ -439,9 +438,6 @@ frontend_dispatch_main(int fd, short event, void *bula)
|
||||
nconf = NULL;
|
||||
for (i = 0; ifaces[i] != 0; i++) {
|
||||
if_index = ifaces[i];
|
||||
if_name = if_indextoname(if_index, ifnamebuf);
|
||||
log_debug("changed iface: %s[%d]", if_name !=
|
||||
NULL ? if_name : "<unknown>", if_index);
|
||||
frontend_imsg_compose_engine(
|
||||
IMSG_REQUEST_REBOOT, 0, 0, &if_index,
|
||||
sizeof(if_index));
|
||||
@@ -597,7 +593,6 @@ update_iface(struct if_msghdr *ifm, struct sockaddr_dl *sdl)
|
||||
struct imsg_ifinfo ifinfo;
|
||||
uint32_t if_index;
|
||||
int flags, xflags;
|
||||
char ifnamebuf[IF_NAMESIZE], *if_name;
|
||||
|
||||
if_index = ifm->ifm_index;
|
||||
|
||||
@@ -605,21 +600,11 @@ update_iface(struct if_msghdr *ifm, struct sockaddr_dl *sdl)
|
||||
xflags = ifm->ifm_xflags;
|
||||
|
||||
iface = get_iface_by_id(if_index);
|
||||
if_name = if_indextoname(if_index, ifnamebuf);
|
||||
|
||||
if (if_name == NULL) {
|
||||
if (iface != NULL) {
|
||||
log_debug("interface with idx %d removed", if_index);
|
||||
frontend_imsg_compose_engine(IMSG_REMOVE_IF, 0, 0,
|
||||
&if_index, sizeof(if_index));
|
||||
remove_iface(if_index);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(xflags & IFXF_AUTOCONF4)) {
|
||||
if (iface != NULL) {
|
||||
log_info("Removed autoconf flag from %s", if_name);
|
||||
log_info("Removed autoconf flag from %s",
|
||||
iface->ifinfo.if_name);
|
||||
frontend_imsg_compose_engine(IMSG_REMOVE_IF, 0, 0,
|
||||
&if_index, sizeof(if_index));
|
||||
remove_iface(if_index);
|
||||
@@ -629,6 +614,9 @@ update_iface(struct if_msghdr *ifm, struct sockaddr_dl *sdl)
|
||||
|
||||
memset(&ifinfo, 0, sizeof(ifinfo));
|
||||
ifinfo.if_index = if_index;
|
||||
if (if_indextoname(if_index, ifinfo.if_name) == NULL)
|
||||
return; /* interface disappeared */
|
||||
|
||||
ifinfo.link_state = ifm->ifm_data.ifi_link_state;
|
||||
ifinfo.rdomain = ifm->ifm_tableid;
|
||||
ifinfo.running = (flags & (IFF_UP | IFF_RUNNING)) ==
|
||||
@@ -639,7 +627,8 @@ update_iface(struct if_msghdr *ifm, struct sockaddr_dl *sdl)
|
||||
memcpy(ifinfo.hw_address.ether_addr_octet, LLADDR(sdl),
|
||||
ETHER_ADDR_LEN);
|
||||
else if (iface == NULL) {
|
||||
log_warnx("Could not find AF_LINK address for %s.", if_name);
|
||||
log_warnx("Could not find AF_LINK address for %s.",
|
||||
ifinfo.if_name);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -708,6 +697,7 @@ init_ifaces(void)
|
||||
|
||||
memset(&ifinfo, 0, sizeof(ifinfo));
|
||||
ifinfo.if_index = if_index;
|
||||
memcpy(&ifinfo.if_name, if_name, sizeof(ifinfo.if_name));
|
||||
ifinfo.link_state = -1;
|
||||
ifinfo.running = (flags & (IFF_UP | IFF_RUNNING)) ==
|
||||
(IFF_UP | IFF_RUNNING);
|
||||
@@ -1060,7 +1050,6 @@ void
|
||||
send_packet(uint8_t message_type, struct iface *iface)
|
||||
{
|
||||
ssize_t pkt_len;
|
||||
char ifnamebuf[IF_NAMESIZE], *if_name;
|
||||
|
||||
if (!event_initialized(&iface->bpfev.ev)) {
|
||||
iface->send_discover = 1;
|
||||
@@ -1069,13 +1058,10 @@ send_packet(uint8_t message_type, struct iface *iface)
|
||||
|
||||
iface->send_discover = 0;
|
||||
|
||||
if ((if_name = if_indextoname(iface->ifinfo.if_index, ifnamebuf)) == NULL)
|
||||
return; /* iface went away, nothing to do */
|
||||
|
||||
log_debug("%s on %s", message_type == DHCPDISCOVER ? "DHCPDISCOVER" :
|
||||
"DHCPREQUEST", if_name);
|
||||
"DHCPREQUEST", iface->ifinfo.if_name);
|
||||
|
||||
pkt_len = build_packet(message_type, if_name, iface->xid,
|
||||
pkt_len = build_packet(message_type, iface->ifinfo.if_name, iface->xid,
|
||||
&iface->ifinfo.hw_address, &iface->ciaddr, &iface->requested_ip,
|
||||
&iface->server_identifier);
|
||||
if (iface->dhcp_server.s_addr != INADDR_ANY) {
|
||||
|
||||
Reference in New Issue
Block a user