Commit 4883f701 authored by Anthony Avina's avatar Anthony Avina Committed by Daniel Stenberg
Browse files

hostip: fix unintended destruction of hash table

.. and added unit1602 for hash.c
parent 39b9bf60
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -126,7 +126,7 @@ int Curl_conncache_init(struct conncache *connc, int size)
void Curl_conncache_destroy(struct conncache *connc)
{
  if(connc)
    Curl_hash_clean(&connc->hash);
    Curl_hash_destroy(&connc->hash);
}

/* returns an allocated key to find a bundle for this connection */
+16 −2
Original line number Diff line number Diff line
@@ -212,8 +212,11 @@ Curl_hash_apply(curl_hash *h, void *user,
}
#endif

/* Destroys all the entries in the given hash and resets its attributes,
 * prepping the given hash for [static|dynamic] deallocation.
 */
void
Curl_hash_clean(struct curl_hash *h)
Curl_hash_destroy(struct curl_hash *h)
{
  int i;

@@ -227,6 +230,17 @@ Curl_hash_clean(struct curl_hash *h)
  h->slots = 0;
}

/* Removes all the entries in the given hash.
 *
 * @unittest: 1602
 */
void
Curl_hash_clean(struct curl_hash *h)
{
  Curl_hash_clean_with_criterium(h, NULL, NULL);
}

/* Cleans all entries that pass the comp function criteria. */
void
Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
                               int (*comp)(void *, void *))
@@ -246,7 +260,7 @@ Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
      struct curl_hash_element *he = le->ptr;
      lnext = le->next;
      /* ask the callback function if we shall remove this entry or not */
      if(comp(user, he->ptr)) {
      if(comp == NULL || comp(user, he->ptr)) {
        Curl_llist_remove(list, le, (void *) h);
        --h->size; /* one less entry in the hash now */
      }
+1 −0
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ void *Curl_hash_pick(struct curl_hash *, void * key, size_t key_len);
void Curl_hash_apply(struct curl_hash *h, void *user,
                     void (*cb)(void *user, void *ptr));
int Curl_hash_count(struct curl_hash *h);
void Curl_hash_destroy(struct curl_hash *h);
void Curl_hash_clean(struct curl_hash *h);
void Curl_hash_clean_with_criterium(struct curl_hash *h, void *user,
                                    int (*comp)(void *, void *));
+1 −1
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ struct curl_hash *Curl_global_host_cache_init(void)
void Curl_global_host_cache_dtor(void)
{
  if(host_cache_initialized) {
    Curl_hash_clean(&hostname_cache);
    Curl_hash_destroy(&hostname_cache);
    host_cache_initialized = 0;
  }
}
+4 −4
Original line number Diff line number Diff line
@@ -324,8 +324,8 @@ struct Curl_multi *Curl_multi_handle(int hashsize, /* socket hash */

  error:

  Curl_hash_clean(&multi->sockhash);
  Curl_hash_clean(&multi->hostcache);
  Curl_hash_destroy(&multi->sockhash);
  Curl_hash_destroy(&multi->hostcache);
  Curl_conncache_destroy(&multi->conn_cache);
  Curl_close(multi->closure_handle);
  multi->closure_handle = NULL;
@@ -1874,7 +1874,7 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle)
      Curl_close(multi->closure_handle);
    }

    Curl_hash_clean(&multi->sockhash);
    Curl_hash_destroy(&multi->sockhash);
    Curl_conncache_destroy(&multi->conn_cache);
    Curl_llist_destroy(multi->msglist, NULL);
    Curl_llist_destroy(multi->pending, NULL);
@@ -1897,7 +1897,7 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle)
      data = nextdata;
    }

    Curl_hash_clean(&multi->hostcache);
    Curl_hash_destroy(&multi->hostcache);

    /* Free the blacklists by setting them to NULL */
    Curl_pipeline_set_site_blacklist(NULL, &multi->pipelining_site_bl);
Loading