Skip to content

Commit

Permalink
Add calls to nvlist_destroy to avoid leaks
Browse files Browse the repository at this point in the history
Some memory leaks were detected by valgrind on the openvpn daemon, using
DCO mode on a FreeBSD platform.  The leaks are caused by missing
nvlist_destroy calls in the file dco_freebsd.c.

Calls to nvlist_destroy were added, sometimes using local variables to
store nvlist pointers temporarly.  A valgrind run on the updated daemon
confirmed that  the leaks were gone.

Github: #636
Signed-off-by: Rémi Farault <[email protected]>

Acked-by: Kristof Provost <[email protected]>
Acked-by: Gert Doering <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg29701.html
Signed-off-by: Gert Doering <[email protected]>
(cherry picked from commit dee0748)
  • Loading branch information
remif-stormshield authored and cron2 committed Nov 5, 2024
1 parent b98ff0e commit a5d2544
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions src/openvpn/dco_freebsd.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ dco_new_peer(dco_context_t *dco, unsigned int peerid, int sd,
struct in_addr *remote_in4, struct in6_addr *remote_in6)
{
struct ifdrv drv;
nvlist_t *nvl;
nvlist_t *nvl, *local_nvl, *remote_nvl;
int ret;

nvl = nvlist_create(0);
Expand All @@ -87,12 +87,14 @@ dco_new_peer(dco_context_t *dco, unsigned int peerid, int sd,

if (localaddr)
{
nvlist_add_nvlist(nvl, "local", sockaddr_to_nvlist(localaddr));
local_nvl = sockaddr_to_nvlist(localaddr);
nvlist_add_nvlist(nvl, "local", local_nvl);
}

if (remoteaddr)
{
nvlist_add_nvlist(nvl, "remote", sockaddr_to_nvlist(remoteaddr));
remote_nvl = sockaddr_to_nvlist(remoteaddr);
nvlist_add_nvlist(nvl, "remote", remote_nvl);
}

if (remote_in4)
Expand Down Expand Up @@ -121,6 +123,14 @@ dco_new_peer(dco_context_t *dco, unsigned int peerid, int sd,
}

free(drv.ifd_data);
if (localaddr)
{
nvlist_destroy(local_nvl);
}
if (remoteaddr)
{
nvlist_destroy(remote_nvl);
}
nvlist_destroy(nvl);

return ret;
Expand Down Expand Up @@ -418,7 +428,7 @@ dco_new_key(dco_context_t *dco, unsigned int peerid, int keyid,
const char *ciphername)
{
struct ifdrv drv;
nvlist_t *nvl;
nvlist_t *nvl, *encrypt_nvl, *decrypt_nvl;
int ret;

msg(D_DCO_DEBUG, "%s: slot %d, key-id %d, peer-id %d, cipher %s",
Expand All @@ -430,10 +440,11 @@ dco_new_key(dco_context_t *dco, unsigned int peerid, int keyid,
nvlist_add_number(nvl, "keyid", keyid);
nvlist_add_number(nvl, "peerid", peerid);

nvlist_add_nvlist(nvl, "encrypt",
key_to_nvlist(encrypt_key, encrypt_iv, ciphername));
nvlist_add_nvlist(nvl, "decrypt",
key_to_nvlist(decrypt_key, decrypt_iv, ciphername));
encrypt_nvl = key_to_nvlist(encrypt_key, encrypt_iv, ciphername);
decrypt_nvl = key_to_nvlist(decrypt_key, decrypt_iv, ciphername);

nvlist_add_nvlist(nvl, "encrypt", encrypt_nvl);
nvlist_add_nvlist(nvl, "decrypt", decrypt_nvl);

CLEAR(drv);
snprintf(drv.ifd_name, IFNAMSIZ, "%s", dco->ifname);
Expand All @@ -451,6 +462,8 @@ dco_new_key(dco_context_t *dco, unsigned int peerid, int keyid,
}

free(drv.ifd_data);
nvlist_destroy(encrypt_nvl);
nvlist_destroy(decrypt_nvl);
nvlist_destroy(nvl);

return ret;
Expand Down Expand Up @@ -750,6 +763,7 @@ dco_get_peer_stats_multi(dco_context_t *dco, struct multi_context *m)
if (!nvlist_exists_nvlist_array(nvl, "peers"))
{
/* no peers */
nvlist_destroy(nvl);
return 0;
}

Expand All @@ -762,6 +776,7 @@ dco_get_peer_stats_multi(dco_context_t *dco, struct multi_context *m)
dco_update_peer_stat(m, peerid, nvlist_get_nvlist(peer, "bytes"));
}

nvlist_destroy(nvl);
return 0;
}

Expand Down

0 comments on commit a5d2544

Please sign in to comment.