prop224: Fix memleak in client_get_random_intro().

The memleak was occuring because of the way ExcludeNodes is handled in
that function. Basically, we were putting excluded intro points extend
infos in a special variable which was never freed. Also, if there were
multiple excluded intro points then that variable was overwritten
everytime leaking more memory. This commit should fix both issues.
This commit is contained in:
George Kadianakis 2017-08-29 18:29:05 +03:00
parent e9b4624cc5
commit 5cc80692b8

View File

@ -646,6 +646,12 @@ client_get_random_intro(const ed25519_public_key_t *service_pk)
/* If this pick is in the ExcludeNodes list, we keep its reference so if /* If this pick is in the ExcludeNodes list, we keep its reference so if
* we ever end up not being able to pick anything else and StrictNodes is * we ever end up not being able to pick anything else and StrictNodes is
* unset, we'll use it. */ * unset, we'll use it. */
if (ei_excluded) {
/* If something was already here free it. After the loop is gone we
* will examine the last excluded intro point, and that's fine since
* that's random anyway */
extend_info_free(ei_excluded);
}
ei_excluded = ei; ei_excluded = ei;
continue; continue;
} }
@ -662,6 +668,7 @@ client_get_random_intro(const ed25519_public_key_t *service_pk)
if (options->StrictNodes) { if (options->StrictNodes) {
log_warn(LD_REND, "Every introduction points are in the ExcludeNodes set " log_warn(LD_REND, "Every introduction points are in the ExcludeNodes set "
"and StrictNodes is set. We can't connect."); "and StrictNodes is set. We can't connect.");
extend_info_free(ei);
ei = NULL; ei = NULL;
} }