From 3dad55d7a839933b84a1c79c0a41dbc5d91f78d7 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sun, 26 Mar 2006 08:52:43 +0000 Subject: Tor Arntsen figured out that TFTP was broken on a lot of systems since we called bind() with a too big argument in the 3rd parameter and at least Tru64, AIX and IRIX seem to be very picky about it. --- lib/tftp.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'lib/tftp.c') diff --git a/lib/tftp.c b/lib/tftp.c index 9af1cf9b5..711bf1720 100644 --- a/lib/tftp.c +++ b/lib/tftp.c @@ -559,14 +559,28 @@ CURLcode Curl_tftp_connect(struct connectdata *conn, bool *done) #ifdef WIN32 /* AF_UNSPEC == 0 (from above calloc) doesn't work on Winsock */ - ((struct sockaddr_in*)&state->local_addr)->sin_family = conn->ip_addr->ai_family; + + /* NOTE: this blatantly assumes IPv4. This should be fixed! */ + ((struct sockaddr_in*)&state->local_addr)->sin_family = + conn->ip_addr->ai_family; #endif tftp_set_timeouts(state); - /* Bind to any interface, random UDP port */ + /* Bind to any interface, random UDP port. + * + * 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, + * but we learned that at least Tru64, AIX and IRIX *requires* the size of + * that argument to match the exact size of a 'sockaddr_in' struct when + * running IPv4-only. + * + * Therefore we use the size from the address we connected to, which we + * assume uses the same IP version and thus hopefully this works for both + * IPv4 and IPv6... + */ rc = bind(state->sockfd, (struct sockaddr *)&state->local_addr, - sizeof(state->local_addr)); + conn->ip_addr->ai_addrlen); if(rc) { failf(conn->data, "bind() failed; %s\n", Curl_strerror(conn,Curl_ourerrno())); -- cgit v1.2.3