- 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:
Родитель
b723500af0
Коммит
1fddcb3f88
8
CHANGES
8
CHANGES
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
20
src/main.c
20
src/main.c
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче