From e59e8ebf31fa1bb654dd939e753746f801ff7b94 Mon Sep 17 00:00:00 2001 From: Philip Withnall Date: Tue, 9 May 2023 12:52:42 +0100 Subject: [PATCH] gwin32networkmonitor: Fix returning address of local variable Something has changed recently which causes this error to now be emitted when building on Windows msys2-mingw32: ``` ../gio/gwin32networkmonitor.c: In function 'win_network_monitor_get_ip_info': ../gio/gwin32networkmonitor.c:92:15: error: storing the address of local variable 'prefix' in '*dest' [-Werror=dangling-pointer=] 92 | *dest = (guint8 *) &prefix.Prefix.Ipv4.sin_addr; | ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``` If `IP_ADDRESS_PREFIX` is defined as a scalar rather than a pointer, that could explain the problem. Change the function to always operate on a pointer to avoid any potential such issues. Signed-off-by: Philip Withnall --- gio/gwin32networkmonitor.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/gio/gwin32networkmonitor.c b/gio/gwin32networkmonitor.c index 9dd5da757..e219225f0 100644 --- a/gio/gwin32networkmonitor.c +++ b/gio/gwin32networkmonitor.c @@ -78,24 +78,24 @@ g_win32_network_monitor_init (GWin32NetworkMonitor *win) } static gboolean -win_network_monitor_get_ip_info (IP_ADDRESS_PREFIX prefix, - GSocketFamily *family, - const guint8 **dest, - gsize *len) +win_network_monitor_get_ip_info (const IP_ADDRESS_PREFIX *prefix, + GSocketFamily *family, + const guint8 **dest, + gsize *len) { - switch (prefix.Prefix.si_family) + switch (prefix->Prefix.si_family) { case AF_UNSPEC: /* Fall-through: AF_UNSPEC deliveres both IPV4 and IPV6 infos, let`s stick with IPV4 here */ case AF_INET: *family = G_SOCKET_FAMILY_IPV4; - *dest = (guint8 *) &prefix.Prefix.Ipv4.sin_addr; - *len = prefix.PrefixLength; + *dest = (guint8 *) &(prefix->Prefix.Ipv4.sin_addr); + *len = prefix->PrefixLength; break; case AF_INET6: *family = G_SOCKET_FAMILY_IPV6; - *dest = (guint8 *) &prefix.Prefix.Ipv6.sin6_addr; - *len = prefix.PrefixLength; + *dest = (guint8 *) &(prefix->Prefix.Ipv6.sin6_addr); + *len = prefix->PrefixLength; break; default: return FALSE; @@ -152,7 +152,7 @@ win_network_monitor_process_table (GWin32NetworkMonitor *win, route = routes->Table + i; - if (!win_network_monitor_get_ip_info (route->DestinationPrefix, &family, &dest, &len)) + if (!win_network_monitor_get_ip_info (&route->DestinationPrefix, &family, &dest, &len)) continue; network = get_network_mask (family, dest, len); @@ -218,13 +218,13 @@ win_network_monitor_invoke_route_changed (gpointer user_data) switch (route_data->type) { case MibDeleteInstance: - if (!win_network_monitor_get_ip_info (route_data->route->DestinationPrefix, &family, &dest, &len)) + if (!win_network_monitor_get_ip_info (&route_data->route->DestinationPrefix, &family, &dest, &len)) break; remove_network (route_data->win, family, dest, len); break; case MibAddInstance: - if (!win_network_monitor_get_ip_info (route_data->route->DestinationPrefix, &family, &dest, &len)) + if (!win_network_monitor_get_ip_info (&route_data->route->DestinationPrefix, &family, &dest, &len)) break; add_network (route_data->win, family, dest, len);