mem-pool: Fix potential memory leak and lost leases when reassigning leases
authorTobias Brunner <tobias@strongswan.org>
Tue, 11 Nov 2014 17:50:26 +0000 (18:50 +0100)
committerTobias Brunner <tobias@strongswan.org>
Tue, 11 Nov 2014 18:00:02 +0000 (19:00 +0100)
If no offline leases are available for the current client and assigning online
leases is disabled, and if all IPs of the pool have already been assigned to
clients we look for offline leases that previously were assigned to other
clients.

In case the current client has online leases the previous code would
replace the existing mapping entry and besides resulting in a memory leak
the online leases would be lost forever (even if the client later releases
the addresses).  If this happens repeatedly the number of available addresses
would decrease even though the total number of online and offline leases seen
in `ipsec leases` would indicate that there are free addresses available.

Fixes #764.

src/libhydra/attributes/mem_pool.c

index 225abe3..f35ffaa 100644 (file)
@@ -342,9 +342,13 @@ static int get_reassigned(private_mem_pool_t *this, identification_t *id)
 
        if (offset)
        {
-               entry = entry_create(id);
+               entry = this->leases->get(this->leases, id);
+               if (!entry)
+               {
+                       entry = entry_create(id);
+                       this->leases->put(this->leases, entry->id, entry);
+               }
                array_insert(entry->online, ARRAY_TAIL, &offset);
-               this->leases->put(this->leases, entry->id, entry);
        }
        return offset;
 }