FTP: prevent the multi interface from blocking

As pointed out in Bug report #3579064, curl_multi_perform() would
wrongly use a blocking mechanism internally for some commands which
could lead to for example a very long block if the LIST response never
showed.

The solution was to make sure to properly continue to use the multi
interface non-blocking state machine.

The new test 1501 verifies the fix.

Bug: http://curl.haxx.se/bug/view.cgi?id=3579064
Reported by: Guido Berhoerster
This commit is contained in:
Daniel Stenberg 2012-11-04 18:22:48 +01:00
parent 7c0f201075
commit b2954e66e8
9 changed files with 234 additions and 22 deletions

View file

@ -93,7 +93,7 @@ test1379 test1380 test1381 test1382 test1383 test1384 test1385 test1386 \
test1387 test1388 test1389 test1390 test1391 test1392 test1393 \
test1400 test1401 test1402 test1403 test1404 test1405 test1406 test1407 \
test1408 test1409 test1410 test1411 \
test1500 \
test1500 test1501 \
test2000 test2001 test2002 test2003 test2004 test2005 test2006 test2007 \
test2008 test2009 test2010 test2011 test2012 test2013 test2014 test2015 \
test2016 test2017 test2018 test2019 test2020 test2021 test2022 \

53
tests/data/test1501 Normal file
View file

@ -0,0 +1,53 @@
<testcase>
<info>
<keywords>
FTP
RETR
multi
LIST
</keywords>
</info>
# Server-side
<reply>
<data>
</data>
<servercmd>
DELAY LIST 2
DELAY TYPE 2
</servercmd>
</reply>
# Client-side
<client>
<server>
ftp
</server>
<tool>
lib1501
</tool>
<name>
FTP with multi interface and slow LIST response
</name>
<command>
ftp://%HOSTIP:%FTPPORT/1501/
</command>
</client>
# Verify data after the test has been "shot"
<verify>
<errorcode>
0
</errorcode>
<protocol>
USER anonymous
PASS ftp@example.com
PWD
CWD 1501
EPSV
TYPE A
LIST
QUIT
</protocol>
</verify>
</testcase>

View file

@ -63,8 +63,9 @@ TYPE I
STOR 591
QUIT
</protocol>
# CURLE_UPLOAD_FAILED = 25
<errorcode>
10
25
</errorcode>
<upload>
</upload>

View file

@ -52,6 +52,7 @@ Moooooooooooo for 592
s/^PORT (.*)/PORT/
s/^EPRT \|1\|(.*)/EPRT \|1\|/
</strippart>
# a 421 response must prevent further commands from being sent
<protocol>
USER anonymous
PASS ftp@example.com
@ -61,10 +62,10 @@ EPRT |1|
PORT
TYPE I
STOR 592
QUIT
</protocol>
# 28 == CURLE_OPERATION_TIMEDOUT
<errorcode>
10
28
</errorcode>
<upload>
</upload>