]> granicus.if.org Git - curl/commit
connect: treat an interface bindlocal() problem as a non-fatal error
authorKim Vandry <vandry@TZoNE.ORG>
Wed, 3 Apr 2013 20:06:51 +0000 (16:06 -0400)
committerDaniel Stenberg <daniel@haxx.se>
Sat, 6 Apr 2013 14:51:58 +0000 (16:51 +0200)
commit090b55c100be4364ac035b5a1b7440cf94e71904
tree7e10851446a7888b82c1f54ca5b60088ff9847ae
parenta181e7b084b67112084d6cbce166a1ac1ffaecd4
connect: treat an interface bindlocal() problem as a non-fatal error

I am using curl_easy_setopt(CURLOPT_INTERFACE, "if!something") to force
transfers to use a particular interface but the transfer fails with
CURLE_INTERFACE_FAILED, "Failed binding local connection end" if the
interface I specify has no IPv6 address. The cause is as follows:

The remote hostname resolves successfully and has an IPv6 address and an
IPv4 address.

cURL attempts to connect to the IPv6 address first.

bindlocal (in lib/connect.c) fails because Curl_if2ip cannot find an
IPv6 address on the interface.

This is a fatal error in singleipconnect()

This change will make cURL try the next IP address in the list.

Also included are two changes related to IPv6 address scope:

- Filter the choice of address in Curl_if2ip to only consider addresses
with the same scope ID as the connection address (mismatched scope for
local and remote address does not result in a working connection).

- bindlocal was ignoring the scope ID of addresses returned by
Curl_if2ip . Now it uses them.

Bug: http://curl.haxx.se/bug/view.cgi?id=1189
lib/connect.c
lib/ftp.c
lib/if2ip.c
lib/if2ip.h