From: David Herrmann Date: Wed, 26 Aug 2015 10:30:56 +0000 (+0200) Subject: sd-dhcp: don't randomly ref objects X-Git-Tag: v225~11 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e6b18ffaea7d557eec3028a37c043da67a78550c;p=thirdparty%2Fsystemd.git sd-dhcp: don't randomly ref objects In our API design, getter-functions don't ref objects. Calls like foo_get_bar() will not ref 'bar'. We never do that and there is no real reason to do it in single threaded APIs. If you need a ref-count, you better take it yourself *BEFORE* doing anything else on the parent object (as this might invalidate your pointer). Right now, sd_dhcp?_get_lease() refs the lease it returns. A lot of code-paths in systemd do not expect this and thus leak the lease reference. Fix this by changing the API to not ref returned objects. --- diff --git a/src/libsystemd-network/sd-dhcp-client.c b/src/libsystemd-network/sd-dhcp-client.c index 6a0d270739d..46104afdeda 100644 --- a/src/libsystemd-network/sd-dhcp-client.c +++ b/src/libsystemd-network/sd-dhcp-client.c @@ -348,7 +348,7 @@ int sd_dhcp_client_get_lease(sd_dhcp_client *client, sd_dhcp_lease **ret) { client->state != DHCP_STATE_REBINDING) return -EADDRNOTAVAIL; - *ret = sd_dhcp_lease_ref(client->lease); + *ret = client->lease; return 0; } diff --git a/src/libsystemd-network/sd-dhcp6-client.c b/src/libsystemd-network/sd-dhcp6-client.c index bc17c6adc50..10c3654020b 100644 --- a/src/libsystemd-network/sd-dhcp6-client.c +++ b/src/libsystemd-network/sd-dhcp6-client.c @@ -260,7 +260,7 @@ int sd_dhcp6_client_get_lease(sd_dhcp6_client *client, sd_dhcp6_lease **ret) { if (!client->lease) return -ENOMSG; - *ret = sd_dhcp6_lease_ref(client->lease); + *ret = client->lease; return 0; } diff --git a/src/libsystemd-network/test-dhcp-client.c b/src/libsystemd-network/test-dhcp-client.c index d341210887c..200499d613b 100644 --- a/src/libsystemd-network/test-dhcp-client.c +++ b/src/libsystemd-network/test-dhcp-client.c @@ -393,7 +393,6 @@ static void test_addr_acq_acquired(sd_dhcp_client *client, int event, if (verbose) printf(" DHCP address acquired\n"); - sd_dhcp_lease_unref(lease); sd_event_exit(e, 0); } diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 6288644a1a3..1b2ff7c7697 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -365,7 +365,7 @@ static int dhcp_lease_renew(sd_dhcp_client *client, Link *link) { sd_dhcp_lease_unref(link->dhcp_lease); link->dhcp4_configured = false; - link->dhcp_lease = lease; + link->dhcp_lease = sd_dhcp_lease_ref(lease); r = sd_dhcp_lease_get_address(lease, &address); if (r < 0) { @@ -454,7 +454,7 @@ static int dhcp_lease_acquired(sd_dhcp_client *client, Link *link) { "PREFIXLEN=%u", prefixlen, NULL); - link->dhcp_lease = lease; + link->dhcp_lease = sd_dhcp_lease_ref(lease); if (link->network->dhcp_mtu) { uint16_t mtu;