diff --git a/lib/sendf.c b/lib/sendf.c index 99e3f65f8274f020f1577a720d2ab4ab28957a45..fd58220d9d40855fc762e6eb281c5437daff49a8 100644 --- a/lib/sendf.c +++ b/lib/sendf.c @@ -140,8 +140,10 @@ void Curl_failf(struct SessionHandle *data, const char *fmt, ...) { va_list ap; va_start(ap, fmt); - if(data->set.errorbuffer) + if(data->set.errorbuffer && !data->state.errorbuf) { vsnprintf(data->set.errorbuffer, CURL_ERROR_SIZE, fmt, ap); + data->state.errorbuf = TRUE; /* wrote error string */ + } va_end(ap); } diff --git a/lib/transfer.c b/lib/transfer.c index 28fbf702dfacf710bd30786648ff9dc5848e2a49..449b2e6eb26572f852b2ea7406c01e2292b7c5a2 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -863,7 +863,7 @@ Transfer(struct connectdata *c_conn) } if (data->set.timeout && - ((Curl_tvdiff(now, start)/1000) > data->set.timeout)) { + ((Curl_tvdiff(now, start)/1000) >= data->set.timeout)) { failf (data, "Operation timed out with %d out of %d bytes received", bytecount, conn->size); return CURLE_OPERATION_TIMEOUTED; @@ -914,6 +914,7 @@ CURLcode Curl_perform(struct SessionHandle *data) data->set.followlocation=0; /* reset the location-follow counter */ data->state.this_is_a_follow = FALSE; /* reset this */ + data->state.errorbuf = FALSE; /* no error has occurred */ Curl_initinfo(data); /* reset session-specific information "variables" */ diff --git a/lib/urldata.h b/lib/urldata.h index 1ccead51943cbcab689d54b3372e3e551387d289..a8f1ebe7828116ee7a06b6bbea4af2dd963f6719 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -446,6 +446,9 @@ struct UrlState { long sessionage; /* number of the most recent session */ char scratch[BUFSIZE*2]; /* huge buffer when doing upload CRLF replacing */ + bool errorbuf; /* Set to TRUE if the error buffer is already filled in. + This must be set to FALSE every time _easy_perform() is + called. */ };