summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2024-01-10 14:48:39 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2024-01-10 15:00:59 -0500
commit332419ea0875359672d3aab5cbb47dbaf9392639 (patch)
treefac940c4f40d62477c89d0958118248e3df4dcb4
parent2188064cbe589308fe9be2a3b9ace0efa3a24148 (diff)
interfaces: Avoid overwriting the ifreq struct
-rw-r--r--agent/interfaces.c51
1 files changed, 30 insertions, 21 deletions
diff --git a/agent/interfaces.c b/agent/interfaces.c
index f18c5e8..dea604f 100644
--- a/agent/interfaces.c
+++ b/agent/interfaces.c
@@ -268,30 +268,29 @@ get_local_ips_ioctl (gboolean include_loopback)
(gchar *) ifr < (gchar *) ifc.ifc_req + ifc.ifc_len;
++ifr) {
gchar *addr_string;
+ struct ifreq ifr2;
- if (ioctl (sockfd, SIOCGIFFLAGS, ifr)) {
- nice_debug ("Error : Unable to get IP flags information for interface %s."
+ if (ifr->ifr_addr.sa_family != AF_INET &&
+ ifr->ifr_addr.sa_family != AF_INET6)
+ continue;
+
+ memset (&ifr2, 0, sizeof (ifr2));
+ strncpy (ifr2.ifr_name, ifr->ifr_name, IFNAMSIZ);
+ if (ioctl (sockfd, SIOCGIFFLAGS, &ifr2)) {
+ nice_debug (
+ "Error : Unable to get IP flags information for interface %s."
" Skipping...", ifr->ifr_name);
- continue; /* failed to get flags, skip it */
+ continue; /* failed to get flags, skip it */
}
/* no ip address from interface that is down */
- if ((ifr->ifr_flags & IFF_UP) == 0)
+ if ((ifr2.ifr_flags & IFF_UP) == 0)
continue;
/* no ip address from interface that isn't running */
- if ((ifr->ifr_flags & IFF_RUNNING) == 0)
+ if ((ifr2.ifr_flags & IFF_RUNNING) == 0)
continue;
- if (ioctl(sockfd, SIOCGIFADDR, ifr)) {
- nice_debug ("Error : Unable to get IP address information for interface %s."
- " Skipping...", ifr->ifr_name);
- continue; /* failed to get address, skip it */
- }
-
- if (ifr->ifr_addr.sa_family != AF_INET &&
- ifr->ifr_addr.sa_family != AF_INET6)
- continue;
/* Convert to a string. */
addr_string = sockaddr_to_string (&ifr->ifr_addr);
@@ -377,20 +376,31 @@ get_local_if_index_by_addr_ioctl (NiceAddress *addr)
(gchar *) ifr < (gchar *) ifc.ifc_req + ifc.ifc_len;
++ifr) {
NiceAddress *myaddr = (NiceAddress *) &ifr->ifr_addr;
+ struct ifreq ifr2;
if (!nice_address_equal_no_port (myaddr, addr))
continue;
+
+ memset (&ifr2, 0, sizeof (struct ifreq));
+ strncpy (ifr2.ifr_name, ifr->ifr_name, IFNAMSIZ);
+
+ if (ioctl (sockfd, SIOCGIFINDEX, &ifr2)) {
+ nice_debug ("Error : Unable to get IP address information for interface %s."
+ " Failing...", ifr->ifr_name);
+ goto done;
+ }
+
#if defined(HAVE_IFR_INDEX)
- if (ifr->ifr_index == 0)
+ if (ifr2.ifr_index == 0)
#else
- if (ifr->ifr_ifindex == 0)
+ if (ifr2.ifr_ifindex == 0)
#endif
continue;
#if defined(HAVE_IFR_INDEX)
- if_index = ifr->ifr_index;
+ if_index = ifr2.ifr_index;
#else
- if_index = ifr->ifr_ifindex;
+ if_index = ifr2.ifr_ifindex;
#endif
break;
}
@@ -606,9 +616,8 @@ nice_interfaces_get_ip_for_interface (gchar *interface_name)
g_return_val_if_fail (interface_name != NULL, NULL);
- ifr.ifr_addr.sa_family = AF_INET;
- memset (ifr.ifr_name, 0, sizeof (ifr.ifr_name));
- g_strlcpy (ifr.ifr_name, interface_name, sizeof (ifr.ifr_name));
+ memset (&ifr, 0, sizeof (struct ifreq));
+ strncpy (ifr.ifr_name, interface_name, sizeof (ifr.ifr_name));
if ((sockfd = socket (AF_INET, SOCK_DGRAM, IPPROTO_IP)) < 0) {
nice_debug ("Error : Cannot open socket to retrieve interface list");