now runs fine.
Changelog
+Daniel (6 October 2006)
+- Bogdan Nicula's hanging test case was converted to test case 533 and the test
+ now runs fine.
+
Daniel (4 October 2006)
- Dmitriy Sergeyev provided an example source code that crashed CVS libcurl
but that worked nicely in 7.15.5. I converted it into test case 532 and
Domenico Andreoli, Armel Asselin, Gisle Vanem, Yang Tse, Andrew Biggs,
Peter Sylvester, David McCreedy, Dmitriy Sergeyev, Dmitry Rechkin,
Jari Sundell, Ravi Pratap, Michele Bini, Jeff Pohlmeyer, Michael Wallner,
- Mike Protts, Cory Nelson, Bernard Leak
+ Mike Protts, Cory Nelson, Bernard Leak, Bogdan Nicula
Thanks! (and sorry if I forgot to mention someone)
To get fixed in 7.16.0 (planned release: October 2006)
======================
-66 - Bogdan Nicula's test case
-
67 - Jeff Pohlmeyer's test case
68 - Dmitriy Sergeyev's test02.c and test03.c
case CURLM_STATE_WAITDO:
/* Wait for our turn to DO when we're pipelining requests */
- infof(easy->easy_handle, "Connection #%d: send pipe size = %d\n",
+#ifdef CURLDEBUG
+ infof(easy->easy_handle, "Conn %d send pipe %d inuse %d athead %d\n",
easy->easy_conn->connectindex,
- easy->easy_conn->send_pipe->size);
+ easy->easy_conn->send_pipe->size,
+ easy->easy_conn->writechannel_inuse,
+ Curl_isHandleAtHead(easy->easy_handle,
+ easy->easy_conn->send_pipe));
+#endif
if (!easy->easy_conn->writechannel_inuse &&
Curl_isHandleAtHead(easy->easy_handle,
easy->easy_conn->send_pipe)) {
* If an error was returned, and we aren't in completed state now,
* then we go to completed and consider this transfer aborted.
*/
+ if(easy->easy_conn) {
+ /* if this has a connection, unsubscribe from the pipelines */
+ easy->easy_conn->writechannel_inuse = FALSE;
+ easy->easy_conn->readchannel_inuse = FALSE;
+ }
multistate(easy, CURLM_STATE_COMPLETED);
}
}
Curl_hash_destroy(multi->hostcache);
Curl_hash_destroy(multi->sockhash);
-#if 1
/* go over all connections that have close actions */
for(i=0; i< multi->connc->num; i++) {
if(multi->connc->connects[i] &&
free(cl);
cl= n;
}
-#endif
Curl_rm_connc(multi->connc);
--- /dev/null
+<info>
+<keywords>
+FTP
+PASV
+RETR
+</keywords>
+</info>
+# Server-side
+<reply>
+<data>
+</data>
+
+<servercmd>
+REPLY RETR 550 the file doesn't exist
+REPLY SIZE 550 Can't check for file existence
+</servercmd>
+</reply>
+
+# Client-side
+<client>
+<server>
+ftp
+</server>
+<tool>
+lib533
+</tool>
+ <name>
+FTP RETR a non-existing file twice using the multi interface
+ </name>
+ <command>
+ftp://%HOSTIP:%FTPPORT/path/533
+</command>
+</client>
+
+# Verify data after the test has been "shot"
+<verify>
+<strip>
+</strip>
+<protocol>
+USER anonymous\r
+PASS curl_by_daniel@haxx.se\r
+PWD\r
+CWD path\r
+EPSV\r
+TYPE I\r
+SIZE 533\r
+RETR 533\r
+EPSV\r
+SIZE 533\r
+RETR 533\r
+QUIT\r
+</protocol>
+</verify>
noinst_PROGRAMS = lib500 lib501 lib502 lib503 lib504 lib505 lib506 \
lib507 lib508 lib509 lib510 lib511 lib512 lib513 lib514 lib515 lib516 \
lib517 lib518 lib519 lib520 lib521 lib523 lib524 lib525 lib526 lib527 \
- lib529 lib530 lib532
+ lib529 lib530 lib532 lib533
lib500_SOURCES = lib500.c $(SUPPORTFILES)
lib500_LDADD = $(LIBDIR)/libcurl.la
lib532_CFLAGS = -DLIB532
lib532_LDADD = $(LIBDIR)/libcurl.la
lib532_DEPENDENCIES = $(LIBDIR)/libcurl.la
+
+lib533_SOURCES = lib533.c $(SUPPORTFILES)
+lib533_LDADD = $(LIBDIR)/libcurl.la
+lib533_DEPENDENCIES = $(LIBDIR)/libcurl.la
+
--- /dev/null
+/*****************************************************************************
+ * _ _ ____ _
+ * Project ___| | | | _ \| |
+ * / __| | | | |_) | |
+ * | (__| |_| | _ <| |___
+ * \___|\___/|_| \_\_____|
+ *
+ * $Id$
+ */
+
+#include "test.h"
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+int test(char *URL)
+{
+ int res = 0;
+ CURL *curl;
+ int running;
+ char done=FALSE;
+ CURLM *m;
+ int current=0;
+ int i;
+
+ /* In windows, this will init the winsock stuff */
+ curl_global_init(CURL_GLOBAL_ALL);
+
+ curl = curl_easy_init();
+ if(!curl)
+ return 100 + i; /* major bad */
+
+ curl_easy_setopt(curl, CURLOPT_URL, URL);
+
+ /* go verbose */
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
+
+ m = curl_multi_init();
+
+ res = (int)curl_multi_add_handle(m, curl);
+
+ fprintf(stderr, "Start at URL 0\n");
+
+ while(!done) {
+ fd_set rd, wr, exc;
+ int max_fd;
+ struct timeval interval;
+
+ interval.tv_sec = 1;
+ interval.tv_usec = 0;
+
+ while (res == CURLM_CALL_MULTI_PERFORM) {
+ res = (int)curl_multi_perform(m, &running);
+ if (running <= 0) {
+ if(!current++) {
+ fprintf(stderr, "Advancing to URL 1\n");
+ /* remove the handle we use */
+ curl_multi_remove_handle(m, curl);
+
+ /* make us re-use the same handle all the time, and try resetting
+ the handle first too */
+ curl_easy_reset(curl);
+ curl_easy_setopt(curl, CURLOPT_URL, URL);
+ curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
+
+ /* re-add it */
+ res = (int)curl_multi_add_handle(m, curl);
+ if(res) {
+ fprintf(stderr, "add handle failed: %d.\n", res);
+ res = 243;
+ break;
+ }
+ }
+ else
+ done = TRUE; /* bail out */
+ break;
+ }
+ }
+ if(done)
+ break;
+
+ if (res != CURLM_OK) {
+ fprintf(stderr, "not okay???\n");
+ break;
+ }
+
+ FD_ZERO(&rd);
+ FD_ZERO(&wr);
+ FD_ZERO(&exc);
+ max_fd = 0;
+
+ if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
+ fprintf(stderr, "unexpected failured of fdset.\n");
+ res = 189;
+ break;
+ }
+
+ if (select_test(max_fd+1, &rd, &wr, &exc, &interval) == -1) {
+ fprintf(stderr, "bad select??\n");
+ res = 195;
+ break;
+ }
+
+ res = CURLM_CALL_MULTI_PERFORM;
+ }
+
+ curl_easy_cleanup(curl);
+ curl_multi_cleanup(m);
+
+ curl_global_cleanup();
+ return res;
+}