Commit cef91064 authored by Nick Mathewson's avatar Nick Mathewson 🥔
Browse files

Merge branch 'bug28989_squashed'

parents df1a8a65 b69d28ae
Loading
Loading
Loading
Loading

changes/bug28989

0 → 100644
+5 −0
Original line number Diff line number Diff line
  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.
+33 −1
Original line number Diff line number Diff line
@@ -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();
}