Skip to content
  • Kim Vandry's avatar
    connect: treat an interface bindlocal() problem as a non-fatal error · 090b55c1
    Kim Vandry authored
    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
    090b55c1