- Bjorn Augustsson reported a bug which made curl not report any problems even

though it failed to write a very small download to disk (done in a single
  fwrite call). It turned out to be because fwrite() returned success, but
  there was insufficient error-checking for the fclose() call which tricked
  curl to believe things were fine.
This commit is contained in:
Daniel Stenberg 2009-11-23 13:56:45 +00:00
parent b723500af0
commit 1fddcb3f88
3 changed files with 26 additions and 5 deletions

View File

@ -6,6 +6,14 @@
Changelog
Daniel Stenberg (23 Nov 2009)
- Bjorn Augustsson reported a bug which made curl not report any problems even
though it failed to write a very small download to disk (done in a single
fwrite call). It turned out to be because fwrite() returned success, but
there was insufficient error-checking for the fclose() call which tricked
curl to believe things were fine.
Daniel Stenberg (20 Nov 2009)
- Constantine Sapuntzakis identified a write after close, as the sockets were
closed by libcurl before the SSL lib were shutdown and they may write to its

View File

@ -25,6 +25,7 @@ This release includes the following bugfixes:
o never-pruned DNS cached entries
o HTTP proxy tunnel re-used connection even if tunnel got disabled
o SSL lib post-close write
o curl failed to report write errors for tiny failed downloads
This release includes the following known bugs:
@ -35,6 +36,6 @@ advice from friends like these:
Yang Tse, Kamil Dudka, Christian Schmitz, Constantine Sapuntzakis,
Marco Maggi, Camille Moncelier, Claes Jakobsson, Kevin Baughman,
Marc Kleine-Budde, Jad Chamcham
Marc Kleine-Budde, Jad Chamcham, Bjorn Augustsson
Thanks! (and sorry if I forgot to mention someone)

View File

@ -3316,9 +3316,15 @@ static size_t my_fwrite(void *buffer, size_t sz, size_t nmemb, void *stream)
curl_easy_pause(config->easy, CURLPAUSE_CONT);
}
if(config->nobuffer)
if(config->nobuffer) {
/* disable output buffering */
fflush(out->stream);
rc = fflush(out->stream);
if(rc) {
/* return a value that isn't the same as sz * nmemb */
rc = (0 == (sz * nmemb)) ? 1 : 0;
return rc; /* failure */
}
}
return rc;
}
@ -5170,8 +5176,14 @@ show_error:
}
}
if (outfile && !curlx_strequal(outfile, "-") && outs.stream)
fclose(outs.stream);
if (outfile && !curlx_strequal(outfile, "-") && outs.stream) {
int rc = fclose(outs.stream);
if(!res && rc) {
/* something went wrong in the writing process */
res = CURLE_WRITE_ERROR;
fprintf(config->errors, "(%s) Failed writing body\n", res);
}
}
#ifdef HAVE_UTIME
/* Important that we set the time _after_ the file has been