Commit 17f48fe8 authored by Yang Tse's avatar Yang Tse
Browse files

libcurl: some OOM handling fixes

parent b82bd053
Loading
Loading
Loading
Loading
+9 −10
Original line number Diff line number Diff line
@@ -1107,23 +1107,20 @@ struct curl_slist *Curl_cookie_list(struct SessionHandle *data)

  c = data->cookies->cookies;

  beg = list;
  while(c) {
    /* fill the list with _all_ the cookies we know */
    line = get_netscape_format(c);
    if(line == NULL) {
      curl_slist_free_all(beg);
    if(!line) {
      curl_slist_free_all(list);
      return NULL;
    }
    list = curl_slist_append(list, line);
    beg = curl_slist_append(list, line);
    free(line);
    if(list == NULL) {
      curl_slist_free_all(beg);
    if(!beg) {
      curl_slist_free_all(list);
      return NULL;
    }
    else if(beg == NULL) {
      beg = list;
    }
    list = beg;
    c = c->next;
  }

@@ -1148,10 +1145,12 @@ void Curl_flush_cookies(struct SessionHandle *data, int cleanup)
            data->set.str[STRING_COOKIEJAR]);
  }
  else {
    if(cleanup && data->change.cookielist)
    if(cleanup && data->change.cookielist) {
      /* since nothing is written, we can just free the list of cookie file
         names */
      curl_slist_free_all(data->change.cookielist); /* clean up list */
      data->change.cookielist = NULL;
    }
    Curl_share_lock(data, CURL_LOCK_DATA_COOKIE, CURL_LOCK_ACCESS_SINGLE);
  }

+8 −9
Original line number Diff line number Diff line
@@ -676,16 +676,15 @@ CURL *curl_easy_duphandle(CURL *incurl)

  if(outcurl) {
    if(outcurl->state.connc &&
       (outcurl->state.connc->type == CONNCACHE_PRIVATE))
       (outcurl->state.connc->type == CONNCACHE_PRIVATE)) {
      Curl_rm_connc(outcurl->state.connc);
    if(outcurl->state.headerbuff)
      free(outcurl->state.headerbuff);
    if(outcurl->change.cookielist)
      outcurl->state.connc = NULL;
    }
    curl_slist_free_all(outcurl->change.cookielist);
    if(outcurl->change.url)
      free(outcurl->change.url);
    if(outcurl->change.referer)
      free(outcurl->change.referer);
    outcurl->change.cookielist = NULL;
    Curl_safefree(outcurl->state.headerbuff);
    Curl_safefree(outcurl->change.url);
    Curl_safefree(outcurl->change.referer);
    Curl_freeset(outcurl);
    free(outcurl);
  }
+5 −1
Original line number Diff line number Diff line
@@ -72,9 +72,12 @@ Curl_hash_init(struct curl_hash *h,
    for(i = 0; i < slots; ++i) {
      h->table[i] = Curl_llist_alloc((curl_llist_dtor) hash_element_dtor);
      if(!h->table[i]) {
        while(i--)
        while(i--) {
          Curl_llist_destroy(h->table[i], NULL);
          h->table[i] = NULL;
        }
        free(h->table);
        h->table = NULL;
        return 1; /* failure */
      }
    }
@@ -240,6 +243,7 @@ Curl_hash_clean(struct curl_hash *h)
  }

  free(h->table);
  h->table = NULL;
}

void
+4 −0
Original line number Diff line number Diff line
@@ -131,6 +131,10 @@ Curl_llist_remove(struct curl_llist *list, struct curl_llist_element *e,

  list->dtor(user, e->ptr);

  e->ptr  = NULL;
  e->prev = NULL;
  e->next = NULL;

  free(e);
  --list->size;

+1 −0
Original line number Diff line number Diff line
@@ -1804,6 +1804,7 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle)

    /* remove the pending list of messages */
    Curl_llist_destroy(multi->msglist, NULL);
    multi->msglist = NULL;

    /* remove all easy handles */
    easy = multi->easy.next;
Loading