]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
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 225abe3834cbe10d5fc4a1ec618f19ce7571382a..f35ffaa9c244c691b49c86e9d65ab59693421de6 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;
 }