From c914e6ea5dad4dc6281b189a9b1f20bc77c223c8 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Wed, 23 Jan 2008 22:22:12 +0000 Subject: "Igor" pointed out that CURLOPT_COOKIELIST set to "ALL" leaked memory, and so did "SESS". Fixed now. --- lib/cookie.c | 18 ++++++++++++------ lib/cookie.h | 4 ++-- lib/http.c | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/cookie.c b/lib/cookie.c index 4fb477cbe..3e6c8a1cd 100644 --- a/lib/cookie.c +++ b/lib/cookie.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2007, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -812,7 +812,7 @@ struct Cookie *Curl_cookie_getlist(struct CookieInfo *c, void Curl_cookie_clearall(struct CookieInfo *cookies) { if(cookies) { - Curl_cookie_freelist(cookies->cookies); + Curl_cookie_freelist(cookies->cookies, TRUE); cookies->cookies = NULL; cookies->numcookies = 0; } @@ -824,16 +824,22 @@ void Curl_cookie_clearall(struct CookieInfo *cookies) * * Free a list of cookies previously returned by Curl_cookie_getlist(); * + * The 'cookiestoo' argument tells this function whether to just free the + * list or actually also free all cookies within the list as well. + * ****************************************************************************/ -void Curl_cookie_freelist(struct Cookie *co) +void Curl_cookie_freelist(struct Cookie *co, bool cookiestoo) { struct Cookie *next; if(co) { while(co) { next = co->next; - free(co); /* we only free the struct since the "members" are all - just copied! */ + if(cookiestoo) + freecookie(co); + else + free(co); /* we only free the struct since the "members" are all just + pointed out in the main cookie list! */ co = next; } } @@ -867,7 +873,7 @@ void Curl_cookie_clearsess(struct CookieInfo *cookies) else prev->next = next; - free(curr); + freecookie(curr); cookies->numcookies--; } else diff --git a/lib/cookie.h b/lib/cookie.h index ea4c83602..7fbc72e8a 100644 --- a/lib/cookie.h +++ b/lib/cookie.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2006, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -91,7 +91,7 @@ struct CookieInfo *Curl_cookie_init(struct SessionHandle *data, const char *, struct CookieInfo *, bool); struct Cookie *Curl_cookie_getlist(struct CookieInfo *, const char *, const char *, bool); -void Curl_cookie_freelist(struct Cookie *); +void Curl_cookie_freelist(struct Cookie *cookies, bool cookiestoo); void Curl_cookie_clearall(struct CookieInfo *cookies); void Curl_cookie_clearsess(struct CookieInfo *cookies); void Curl_cookie_cleanup(struct CookieInfo *); diff --git a/lib/http.c b/lib/http.c index 1dcdc0f91..89f5c7615 100644 --- a/lib/http.c +++ b/lib/http.c @@ -2374,7 +2374,7 @@ CURLcode Curl_http(struct connectdata *conn, bool *done) } co = co->next; /* next cookie please */ } - Curl_cookie_freelist(store); /* free the cookie list */ + Curl_cookie_freelist(store, FALSE); /* free the cookie list */ } if(addcookies && (CURLE_OK == result)) { if(!count) -- cgit v1.2.3