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 <pwithnall@endlessos.org>
This commit is contained in:
Philip Withnall 2023-05-09 12:52:42 +01:00
parent de2ff26454
commit e59e8ebf31

View File

@ -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);