summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2016-11-10 08:53:17 +0100
committerThomas Haller <thaller@redhat.com>2016-11-10 09:30:05 +0100
commitde52c25cfd6b452e7529ec222c5d8eacd2466aab (patch)
treef92ad9c7121f64e3747fe1827ba8adf41794edd7 /src
parent2b304d82d77a6caac6fa578bd0be33e817a90be0 (diff)
downloadNetworkManager-de52c25cfd6b452e7529ec222c5d8eacd2466aab.tar.gz
device: refactor ndisc_set_router_config()
- only record @now timestamp if we actually need it. - use gint32 for @now. It seems wrong that NMNDiscDNSServer uses guint32 for the timestamp. We keep nm_utils_get_monotonic_timestamp_s() as gint32 for a reason. - ensure the arrays are initialized to zero. E.g. ndisc_addr->dad_counter was uninitalized. - set the size for arrays outside the loop - use g_array_unref(). I think that is usually better. It makes only a difference when somebody else holds a reference to the array. And in that case, it usually seems better not to clear the array, just release your refrence.
Diffstat (limited to 'src')
-rw-r--r--src/devices/nm-device.c23
1 files changed, 11 insertions, 12 deletions
diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
index e34bc1d3a9..f208143f15 100644
--- a/src/devices/nm-device.c
+++ b/src/devices/nm-device.c
@@ -1821,16 +1821,17 @@ static void
ndisc_set_router_config (NMNDisc *ndisc, NMDevice *self)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
- guint32 now = nm_utils_get_monotonic_timestamp_s ();
+ gint32 now;
GArray *addresses, *dns_servers, *dns_domains;
guint len, i;
if (nm_ndisc_get_node_type (ndisc) != NM_NDISC_NODE_TYPE_ROUTER)
return;
- /* Addresses whose prefixes we announce. */
+ now = nm_utils_get_monotonic_timestamp_s ();
+
len = nm_ip6_config_get_num_addresses (priv->ip6_config);
- addresses = g_array_sized_new (FALSE, FALSE, sizeof (NMNDiscAddress), len);
+ addresses = g_array_sized_new (FALSE, TRUE, sizeof (NMNDiscAddress), len);
for (i = 0; i < len; i++) {
const NMPlatformIP6Address *addr = nm_ip6_config_get_address (priv->ip6_config, i);
NMNDiscAddress *ndisc_addr;
@@ -1853,28 +1854,26 @@ ndisc_set_router_config (NMNDisc *ndisc, NMDevice *self)
ndisc_addr->preferred = addr->preferred;
}
- /* DNS servers. */
len = nm_ip6_config_get_num_nameservers (priv->ip6_config);
- dns_servers = g_array_sized_new (FALSE, FALSE, sizeof (NMNDiscDNSServer), len);
+ dns_servers = g_array_sized_new (FALSE, TRUE, sizeof (NMNDiscDNSServer), len);
+ g_array_set_size (dns_servers, len);
for (i = 0; i < len; i++) {
const struct in6_addr *nameserver = nm_ip6_config_get_nameserver (priv->ip6_config, i);
NMNDiscDNSServer *ndisc_nameserver;
- g_array_set_size (dns_servers, dns_servers->len+1);
ndisc_nameserver = &g_array_index (dns_servers, NMNDiscDNSServer, dns_servers->len-1);
ndisc_nameserver->address = *nameserver;
ndisc_nameserver->timestamp = now;
ndisc_nameserver->lifetime = NM_NDISC_ROUTER_LIFETIME;
}
- /* DNS domains. */
len = nm_ip6_config_get_num_searches (priv->ip6_config);
- dns_domains = g_array_sized_new (FALSE, FALSE, sizeof (NMNDiscDNSDomain), len);
+ dns_domains = g_array_sized_new (FALSE, TRUE, sizeof (NMNDiscDNSDomain), len);
+ g_array_set_size (dns_domains, len);
for (i = 0; i < len; i++) {
const char *search = nm_ip6_config_get_search (priv->ip6_config, i);
NMNDiscDNSDomain *ndisc_search;
- g_array_set_size (dns_domains, dns_domains->len+1);
ndisc_search = &g_array_index (dns_domains, NMNDiscDNSDomain, dns_domains->len-1);
ndisc_search->domain = g_strdup (search);
ndisc_search->timestamp = now;
@@ -1882,9 +1881,9 @@ ndisc_set_router_config (NMNDisc *ndisc, NMDevice *self)
}
nm_ndisc_set_config (ndisc, addresses, dns_servers, dns_domains);
- g_array_free (addresses, TRUE);
- g_array_free (dns_servers, TRUE);
- g_array_free (dns_domains, TRUE);
+ g_array_unref (addresses);
+ g_array_unref (dns_servers);
+ g_array_unref (dns_domains);
}
static gboolean