Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bug: --interface does not consume argument #2104

Closed
ciofeca opened this issue Nov 21, 2017 · 3 comments
Closed

bug: --interface does not consume argument #2104

ciofeca opened this issue Nov 21, 2017 · 3 comments
Labels
not-a-bug This is not a bug in curl

Comments

@ciofeca
Copy link

ciofeca commented Nov 21, 2017

If the argument of --interface is not a valid interface, it should abort with an error.

I did this (on a system without any eth8 network interface):

curl --interface eth8 192.168.5.5

I expected the following:

"Error: eth8 does not exist"

I instead got this:

"curl: (45) Could not resolve host: eth8"

curl/libcurl version

curl 7.55.1 (x86_64-pc-linux-gnu) libcurl/7.55.1 OpenSSL/1.0.2g zlib/1.2.11 libidn2/2.0.2 libpsl/0.18.0 (+libidn2/2.0.2) librtmp/2.3
Release-Date: 2017-08-14
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP UnixSockets HTTPS-proxy PSL

operating system

Ubuntu 17.04

@jay
Copy link
Member

jay commented Nov 22, 2017

It does consume the argument:

"curl: (45) Could not resolve host: eth8"

Error code 45 is CURLE_INTERFACE_FAILED so that is the correct error code. The message
is because if the argument is not an interface then it falls back to treating it as host or ip.

curl/lib/connect.c

Lines 335 to 343 in c514af5

if(!is_interface) {
/*
* This was not an interface, resolve the name as a host name
* or IP number
*
* Temporarily force name resolution to use only the address type
* of the connection. The resolve functions should really be changed
* to take a type parameter instead.
*/

If you turn on verbose you should see * Couldn't bind to 'eth8'

edit: we could make that bind error message what is shown by overwriting the generic resolve error that takes precedence

diff --git a/lib/connect.c b/lib/connect.c
index 16104bc..45e18bc 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -412,6 +412,10 @@ static CURLcode bindlocal(struct connectdata *conn,
     }
 
     if(done < 1) {
+      /* errorbuf is set false so failf will overwrite any message already in
+         the error buffer, so the user receives this error message instead of a
+         generic resolve error. */
+      data->state.errorbuf = FALSE;
       failf(data, "Couldn't bind to '%s'", dev);
       return CURLE_INTERFACE_FAILED;
     }

@mkauf
Copy link
Contributor

mkauf commented Nov 22, 2017

You get a better error message if you add the prefix "if!" to the interface name. This tells curl that it's really an interface. For more information, please see CURLOPT_INTERFACE.

Example:

$ curl --interface 'if!eth8' 192.168.5.5
curl: (45) Couldn't bind to interface 'eth8'

@bagder bagder added the not-a-bug This is not a bug in curl label Nov 23, 2017
@bagder
Copy link
Member

bagder commented Nov 23, 2017

@jay: sounds like a neat improvement

I see no bug or actual issue here. I'm closing...

@bagder bagder closed this as completed Nov 23, 2017
jay added a commit that referenced this issue Nov 23, 2017
eg consider a non-existent interface eth8, curl --interface eth8

Before: curl: (45) Could not resolve host: eth8
After: curl: (45) Couldn't bind to 'eth8'

Bug: #2104
Reported-by: Alfonso Martone
@lock lock bot locked as resolved and limited conversation to collaborators May 6, 2018
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
not-a-bug This is not a bug in curl
Development

No branches or pull requests

4 participants