]> granicus.if.org Git - curl/commit
curl_multi_fdset: correct fdset with FTP PORT use
authorDaniel Stenberg <daniel@haxx.se>
Fri, 21 Oct 2011 21:36:54 +0000 (23:36 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 21 Oct 2011 21:36:54 +0000 (23:36 +0200)
commitd7934b8bd49114cbb54f7401742f7fb088e2f796
tree35beaeb7e2050d89bb2b59b85f2d25d177e63d39
parentd67b75c9f9c59ea4adc40d0b333c6047621573ba
curl_multi_fdset: correct fdset with FTP PORT use

After a PORT has been issued, and the multi handle would switch to the
CURLM_STATE_DO_MORE state (which is unique for FTP), libcurl would
return the wrong fdset to wait for when curl_multi_fdset() is
called. The code would blindly assume that it was waiting for a connect
of the second connection, while that isn't true immediately after the
PORT command.

Also, the function multi.c:domore_getsock() was highly FTP-centric and
therefore ugly to keep in protocol-agnostic code. I solved this problem
by introducing a new function pointer in the Curl_handler struct called
domore_getsock() which is only called during the DOMORE state for
protocols that set that pointer.

The new ftp.c:ftp_domore_getsock() function now returns fdset info about
the control connection's command/response handling while such a state is
in use, and goes over to waiting for a writable second connection first
once the commands are done.

The original problem could be seen by running test 525 and checking the
time stamps in the FTP server log. I can verify that this fix at least
fixes this problem.

Bug: http://curl.haxx.se/mail/lib-2011-10/0250.html
Reported by: Gokhan Sengun
18 files changed:
lib/curl_rtmp.c
lib/dict.c
lib/file.c
lib/ftp.c
lib/gopher.c
lib/http.c
lib/imap.c
lib/ldap.c
lib/multi.c
lib/openldap.c
lib/pop3.c
lib/rtsp.c
lib/smtp.c
lib/ssh.c
lib/telnet.c
lib/tftp.c
lib/url.c
lib/urldata.h