formdata: ack read callback abort

When doing a multipart formpost with a read callback, and that callback
returns CURL_READFUNC_ABORT, that return code must be properly
propagated back and handled accordingly. Previously it would be handled
as a zero byte read which would cause a hang!

Added test case 587 to verify. It uses the lib554.c source code with a
small ifdef.

Reported by: Anton Bychkov
Bug: http://curl.haxx.se/mail/lib-2011-10/0097.html
This commit is contained in:
Daniel Stenberg 2011-10-16 01:07:29 +02:00
parent ff03ee2a3c
commit 840eff44f2
4 changed files with 75 additions and 9 deletions

View file

@ -15,7 +15,7 @@ noinst_PROGRAMS = chkhostname \
lib579 lib529 lib530 lib532 lib533 lib536 lib537 lib540 lib541 lib542 \
lib543 lib544 lib545 lib547 lib548 lib549 lib552 lib553 lib554 lib555 \
lib556 lib539 lib557 lib560 lib562 lib564 lib565 lib566 lib567 lib568 \
lib569 lib570 lib571 lib572 lib573 lib582 lib583 lib585
lib569 lib570 lib571 lib572 lib573 lib582 lib583 lib585 lib587
chkhostname_SOURCES = chkhostname.c $(top_srcdir)/lib/curl_gethostname.c
chkhostname_LDADD = @CURL_NETWORK_LIBS@
@ -166,3 +166,6 @@ lib583_SOURCES = lib583.c $(SUPPORTFILES)
lib585_SOURCES = lib500.c $(SUPPORTFILES)
lib585_CPPFLAGS = $(AM_CPPFLAGS) -DLIB585
lib587_SOURCES = lib554.c $(SUPPORTFILES)
lib587_CPPFLAGS = $(AM_CPPFLAGS) -DLIB587

View file

@ -42,6 +42,14 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
{
struct WriteThis *pooh = (struct WriteThis *)userp;
#ifdef LIB587
(void)ptr;
(void)size;
(void)nmemb;
(void)userp;
return CURL_READFUNC_ABORT;
#else
if(size*nmemb < 1)
return 0;
@ -53,6 +61,7 @@ static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *userp)
}
return 0; /* no more data left to deliver */
#endif
}
int test(char *URL)