- Jeff Pohlmeyer identified two problems: first a rather obscure problem with

the multi interface and connection re-use that could make a
  curl_multi_remove_handle() ruin a pointer in another handle.

  The second problem was less of an actual problem but more of minor quirk:
  the re-using of connections wasn't properly checking if the connection was
  marked for closure.
This commit is contained in:
Daniel Stenberg
2007-02-18 23:02:42 +00:00
parent 300cbc2e21
commit cbf58d88d0
6 changed files with 30 additions and 20 deletions

View File

@@ -2030,7 +2030,8 @@ ConnectionExists(struct SessionHandle *data,
from the multi */
}
infof(data, "Examining connection #%ld for reuse\n", check->connectindex);
DEBUGF(infof(data, "Examining connection #%ld for reuse\n",
check->connectindex));
if(check->inuse && !canPipeline) {
/* can only happen within multi handles, and means that another easy
@@ -2056,11 +2057,11 @@ ConnectionExists(struct SessionHandle *data,
continue;
}
if (data->state.is_in_pipeline && check->bits.close) {
/* Don't pick a connection that is going to be closed */
infof(data, "Connection #%ld has been marked for close, can't reuse\n",
check->connectindex);
continue;
if (check->bits.close) {
/* Don't pick a connection that is going to be closed. */
infof(data, "Connection #%ld has been marked for close, can't reuse\n",
check->connectindex);
continue;
}
if((needle->protocol&PROT_SSL) != (check->protocol&PROT_SSL))
@@ -4136,8 +4137,9 @@ CURLcode Curl_async_resolved(struct connectdata *conn,
CURLcode Curl_done(struct connectdata **connp,
CURLcode status, bool premature) /* an error if this is called after an
error was detected */
CURLcode status, /* an error if this is called after an
error was detected */
bool premature)
{
CURLcode result;
struct connectdata *conn = *connp;