mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
Jari Sundell did some excellent research and bug tracking, figured out that
we did wrong and patched it: When nodes were removed from the splay tree, and we didn't properly remove it from the splay tree when an easy handle was removed from a multi stack and thus we could wrongly leave a node in the splay tree pointing to (bad) memory.
This commit is contained in:
parent
431c4bd6e3
commit
06d05b18b2
7
CHANGES
7
CHANGES
@ -6,6 +6,13 @@
|
|||||||
|
|
||||||
Changelog
|
Changelog
|
||||||
|
|
||||||
|
Daniel (17 July 2006)
|
||||||
|
- Jari Sundell did some excellent research and bug tracking, figured out that
|
||||||
|
we did wrong and patched it: When nodes were removed from the splay tree,
|
||||||
|
and we didn't properly remove it from the splay tree when an easy handle was
|
||||||
|
removed from a multi stack and thus we could wrongly leave a node in the
|
||||||
|
splay tree pointing to (bad) memory.
|
||||||
|
|
||||||
Daniel (14 July 2006)
|
Daniel (14 July 2006)
|
||||||
- David McCreedy fixed a flaw where the CRLF counter wasn't properly cleared
|
- David McCreedy fixed a flaw where the CRLF counter wasn't properly cleared
|
||||||
for FTP ASCII transfers.
|
for FTP ASCII transfers.
|
||||||
|
@ -18,6 +18,7 @@ This release includes the following changes:
|
|||||||
|
|
||||||
This release includes the following bugfixes:
|
This release includes the following bugfixes:
|
||||||
|
|
||||||
|
o splay-tree related problems for internal expire time handling
|
||||||
o FTP ASCII CRLF counter reset
|
o FTP ASCII CRLF counter reset
|
||||||
o cookie parser now compares paths case sensitive
|
o cookie parser now compares paths case sensitive
|
||||||
o an easy handle with shared DNS cache added to a multi handle caused a crash
|
o an easy handle with shared DNS cache added to a multi handle caused a crash
|
||||||
@ -39,6 +40,6 @@ This release would not have looked like this without help, code, reports and
|
|||||||
advice from friends like these:
|
advice from friends like these:
|
||||||
|
|
||||||
Dan Fandrich, Peter Silva, Arve Knudsen, Michael Wallner, Toshiyuki Maezawa,
|
Dan Fandrich, Peter Silva, Arve Knudsen, Michael Wallner, Toshiyuki Maezawa,
|
||||||
Ingmar Runge, Ates Goral, David McCreedy
|
Ingmar Runge, Ates Goral, David McCreedy, Jari Sundell
|
||||||
|
|
||||||
Thanks! (and sorry if I forgot to mention someone)
|
Thanks! (and sorry if I forgot to mention someone)
|
||||||
|
25
lib/multi.c
25
lib/multi.c
@ -381,6 +381,11 @@ CURLMcode curl_multi_remove_handle(CURLM *multi_handle,
|
|||||||
/* If the 'state' is not INIT or COMPLETED, we might need to do something
|
/* If the 'state' is not INIT or COMPLETED, we might need to do something
|
||||||
nice to put the easy_handle in a good known state when this returns. */
|
nice to put the easy_handle in a good known state when this returns. */
|
||||||
|
|
||||||
|
/* The timer must be shut down before easy->multi is set to NULL,
|
||||||
|
else the timenode will remain in the splay tree after
|
||||||
|
curl_easy_cleanup is called. */
|
||||||
|
Curl_expire(easy->easy_handle, 0);
|
||||||
|
|
||||||
if(easy->easy_handle->dns.hostcachetype == HCACHE_MULTI) {
|
if(easy->easy_handle->dns.hostcachetype == HCACHE_MULTI) {
|
||||||
/* clear out the usage of the shared DNS cache */
|
/* clear out the usage of the shared DNS cache */
|
||||||
easy->easy_handle->dns.hostcache = NULL;
|
easy->easy_handle->dns.hostcache = NULL;
|
||||||
@ -962,6 +967,17 @@ CURLMcode curl_multi_perform(CURLM *multi_handle, int *running_handles)
|
|||||||
int key = now.tv_sec; /* drop the usec part */
|
int key = now.tv_sec; /* drop the usec part */
|
||||||
|
|
||||||
multi->timetree = Curl_splaygetbest(key, multi->timetree, &t);
|
multi->timetree = Curl_splaygetbest(key, multi->timetree, &t);
|
||||||
|
|
||||||
|
if (t) {
|
||||||
|
struct SessionHandle *d = t->payload;
|
||||||
|
struct timeval* tv = &d->state.expiretime;
|
||||||
|
|
||||||
|
/* clear the expire times within the handles that we remove from the
|
||||||
|
splay tree */
|
||||||
|
tv->tv_sec = 0;
|
||||||
|
tv->tv_usec = 0;
|
||||||
|
}
|
||||||
|
|
||||||
} while(t);
|
} while(t);
|
||||||
|
|
||||||
return returncode;
|
return returncode;
|
||||||
@ -1207,8 +1223,15 @@ static CURLMcode multi_socket(struct Curl_multi *multi,
|
|||||||
key = now.tv_sec; /* drop the usec part */
|
key = now.tv_sec; /* drop the usec part */
|
||||||
|
|
||||||
multi->timetree = Curl_splaygetbest(key, multi->timetree, &t);
|
multi->timetree = Curl_splaygetbest(key, multi->timetree, &t);
|
||||||
if(t)
|
if(t) {
|
||||||
|
/* assign 'data' to be the easy handle we just removed from the splay
|
||||||
|
tree */
|
||||||
data = t->payload;
|
data = t->payload;
|
||||||
|
/* clear the expire time within the handle we removed from the
|
||||||
|
splay tree */
|
||||||
|
data->state.expiretime.tv_sec = 0;
|
||||||
|
data->state.expiretime.tv_usec = 0;
|
||||||
|
}
|
||||||
|
|
||||||
} while(t);
|
} while(t);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user