Merge branch 'bug28989_squashed'

This commit is contained in:
Nick Mathewson 2019-01-11 18:56:57 -05:00
commit cef910642e
2 changed files with 38 additions and 1 deletions

5
changes/bug28989 Normal file
View File

@ -0,0 +1,5 @@
o Minor bugfixes (unit tests):
- Instead of relying on hs_free_all() to clean up all onion service
objects we created in test_build_descriptors(), deallocate
them one by one. This lets Coverity know that we are not leaking memory
here and fixes CID 1442277. Fixes bug 28989; bugfix on 0.3.5.1-alpha.

View File

@ -267,7 +267,7 @@ helper_clone_authorized_client(const hs_service_authorized_client_t *client)
/* Helper: Return a newly allocated service object with the identity keypair
* sets and the current descriptor. Then register it to the global map.
* Caller should us hs_free_all() to free this service or remove it from the
* Caller should use hs_free_all() to free this service or remove it from the
* global map before freeing. */
static hs_service_t *
helper_create_service(void)
@ -289,6 +289,20 @@ helper_create_service(void)
return service;
}
/* Helper: Deallocate a given service object, its child objects and
* remove it from onion service map.
* */
static void
helper_destroy_service(hs_service_t *service)
{
if (!service)
return;
remove_service(get_hs_service_map(), service);
hs_service_free(service);
}
/* Helper: Return a newly allocated service object with clients. */
static hs_service_t *
helper_create_service_with_clients(int num_clients)
@ -1626,6 +1640,7 @@ test_build_descriptors(void *arg)
{
int ret;
time_t now = time(NULL);
hs_service_t *last_service = NULL;
(void) arg;
@ -1650,6 +1665,7 @@ test_build_descriptors(void *arg)
* is disabled. */
{
hs_service_t *service = helper_create_service();
last_service = service;
service_descriptor_free(service->desc_current);
service->desc_current = NULL;
@ -1660,12 +1676,16 @@ test_build_descriptors(void *arg)
hs_desc_superencrypted_data_t *superencrypted;
superencrypted = &service->desc_current->desc->superencrypted_data;
tt_int_op(smartlist_len(superencrypted->clients), OP_EQ, 16);
helper_destroy_service(service);
last_service = NULL;
}
/* Generate a valid number of fake auth clients when the number of
* clients is zero. */
{
hs_service_t *service = helper_create_service_with_clients(0);
last_service = service;
service_descriptor_free(service->desc_current);
service->desc_current = NULL;
@ -1673,12 +1693,16 @@ test_build_descriptors(void *arg)
hs_desc_superencrypted_data_t *superencrypted;
superencrypted = &service->desc_current->desc->superencrypted_data;
tt_int_op(smartlist_len(superencrypted->clients), OP_EQ, 16);
helper_destroy_service(service);
last_service = NULL;
}
/* Generate a valid number of fake auth clients when the number of
* clients is not a multiple of 16. */
{
hs_service_t *service = helper_create_service_with_clients(20);
last_service = service;
service_descriptor_free(service->desc_current);
service->desc_current = NULL;
@ -1686,12 +1710,16 @@ test_build_descriptors(void *arg)
hs_desc_superencrypted_data_t *superencrypted;
superencrypted = &service->desc_current->desc->superencrypted_data;
tt_int_op(smartlist_len(superencrypted->clients), OP_EQ, 32);
helper_destroy_service(service);
last_service = NULL;
}
/* Do not generate any fake desc client when the number of clients is
* a multiple of 16 but not zero. */
{
hs_service_t *service = helper_create_service_with_clients(32);
last_service = service;
service_descriptor_free(service->desc_current);
service->desc_current = NULL;
@ -1699,9 +1727,13 @@ test_build_descriptors(void *arg)
hs_desc_superencrypted_data_t *superencrypted;
superencrypted = &service->desc_current->desc->superencrypted_data;
tt_int_op(smartlist_len(superencrypted->clients), OP_EQ, 32);
helper_destroy_service(service);
last_service = NULL;
}
done:
helper_destroy_service(last_service);
hs_free_all();
}