Kim Rinnewitz reported that --local-port didn't work with TFTP transfers.

This happened because the tftp code always uncondionally did a bind()
without caring if one already had been done and then it failed. I wrote a
test case (1009) to verify this, but it is a bit error-prone since it will
have to pick a fixed local port number and since the tests are run on so
many different hosts in different situations I add it in disabled state.
This commit is contained in:
Daniel Stenberg 2007-10-04 10:01:41 +00:00
parent 91b38857ef
commit 67d94514b0
8 changed files with 65 additions and 8 deletions

12
CHANGES
View File

@ -6,8 +6,18 @@
Changelog
Daniel S (4 October 2007)
- Kim Rinnewitz reported that --local-port didn't work with TFTP transfers.
This happened because the tftp code always uncondionally did a bind()
without caring if one already had been done and then it failed. I wrote a
test case (1009) to verify this, but it is a bit error-prone since it will
have to pick a fixed local port number and since the tests are run on so
many different hosts in different situations I'll add it in disabled state.
Yang Tse (3 October 2007)
- Fixed issue related with the use of ares_timeout() result.
Daniel S (3 October 2007)
- Yang Tse, fix issue related with the use of ares_timeout() result.
- Alexey Pesternikov introduced CURLOPT_OPENSOCKETFUNCTION and
CURLOPT_OPENSOCKETDATA to set a callback that allows an application to

View File

@ -34,6 +34,7 @@ This release includes the following bugfixes:
o curl_easy_escape() problem with byte values >= 128
o handles chunked-encoded CONNECT responses
o misuse of ares_timeout() result
o --local-port on TFTP transfers
This release includes the following known bugs:
@ -52,6 +53,6 @@ advice from friends like these:
Dan Fandrich, Michal Marek, Günter Knauf, Rob Crittenden, Immanuel Gregoire,
Mark Davies, Max Katsev, Philip Langdale, Alex Fishman, Johnny Luong,
Alexey Pesternikov, Yang Tse
Alexey Pesternikov, Yang Tse, Kim Rinnewitz
Thanks! (and sorry if I forgot to mention someone)

View File

@ -380,6 +380,7 @@ static CURLcode bindlocal(struct connectdata *conn,
port = ntohs(((struct sockaddr_in6 *)&add)->sin6_port);
#endif
infof(data, "Local port: %d\n", port);
conn->bits.bound = TRUE;
return CURLE_OK;
}
if(--portnum > 0) {

View File

@ -598,9 +598,9 @@ CURLcode Curl_tftp_connect(struct connectdata *conn, bool *done)
tftp_set_timeouts(state);
if(!conn->bits.reuse) {
/* If not reused, bind to any interface, random UDP port. If it is reused,
* this has already been done!
if(!conn->bits.bound) {
/* If not already bound, bind to any interface, random UDP port. If it is
* reused or a custom local port was desired, this has already been done!
*
* We once used the size of the local_addr struct as the third argument for
* bind() to better work with IPv6 or whatever size the struct could have,
@ -619,6 +619,7 @@ CURLcode Curl_tftp_connect(struct connectdata *conn, bool *done)
Curl_strerror(conn, SOCKERRNO));
return CURLE_COULDNT_CONNECT;
}
conn->bits.bound = TRUE;
}
Curl_pgrsStartNow(conn->data);

View File

@ -609,6 +609,8 @@ struct ConnectBits {
bool proxy_connect_closed; /* set true if a proxy disconnected the
connection in a CONNECT request with auth, so
that libcurl should reconnect and continue. */
bool bound; /* set true if bind() has already been done on this socket/
connection */
};
struct hostname {

View File

@ -3,5 +3,4 @@
# test cases are run by runtests.pl. Just add the plain test case numbers, one
# per line.
# Lines starting with '#' letters are treated as comments.
#230
1009

View File

@ -45,7 +45,7 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
test706 test707 test350 test351 test352 test353 test289 test540 test354 \
test231 test1000 test1001 test1002 test1003 test1004 test1005 test1006 \
test615 test1007 test541 test1010 test1011 test1012 test542 test543 \
test536 test1008
test536 test1008 test1009
filecheck:
@mkdir test-place; \

43
tests/data/test1009 Normal file
View File

@ -0,0 +1,43 @@
<testcase>
<info>
<keywords>
TFTP
TFTP RRQ
</keywords>
</info>
#
# Server-side
<reply>
<data>
a chunk of
data
returned
to client
</data>
</reply>
#
# Client-side
<client>
<server>
tftp
</server>
<name>
TFTP retrieve
</name>
<command>
tftp://%HOSTIP:%TFTPPORT//1009 --local-port 44444
</command>
</client>
#
# Verify pseudo protocol after the test has been "shot"
<verify>
<protocol>
opcode: 1
filename: /1009
mode: octet
</protocol>
</verify>
</testcase>