123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- diff --git a/include/libssh/config_parser.h b/include/libssh/config_parser.h
- index a7dd42a2c8016789a2dad1c409447da11603a0f0..ca353432b8139e5be334f1b815e910ca03562c84 100644
- --- a/include/libssh/config_parser.h
- +++ b/include/libssh/config_parser.h
- @@ -30,6 +30,8 @@
- extern "C" {
- #endif
-
- +#include <stdbool.h>
- +
- char *ssh_config_get_cmd(char **str);
-
- char *ssh_config_get_token(char **str);
- @@ -49,14 +51,17 @@ int ssh_config_get_yesno(char **str, int notfound);
- * be stored or NULL if we do not care about the result.
- * @param[out] port Pointer to the location, where the new port will
- * be stored or NULL if we do not care about the result.
- + * @param[in] ignore_port Set to true if the we should not attempt to parse
- + * port number.
- *
- * @returns SSH_OK if the provided string is in format of SSH URI,
- * SSH_ERROR on failure
- */
- int ssh_config_parse_uri(const char *tok,
- - char **username,
- - char **hostname,
- - char **port);
- + char **username,
- + char **hostname,
- + char **port,
- + bool ignore_port);
-
- #ifdef __cplusplus
- }
- diff --git a/src/config.c b/src/config.c
- index c5c40125ac243e4d137601d340f91bb4eba8c973..273db7c8c477dd435b8310e8b7784cb0dc578e0a 100644
- --- a/src/config.c
- +++ b/src/config.c
- @@ -464,7 +464,7 @@ ssh_config_parse_proxy_jump(ssh_session session, const char *s, bool do_parsing)
- }
- if (parse_entry) {
- /* We actually care only about the first item */
- - rv = ssh_config_parse_uri(cp, &username, &hostname, &port);
- + rv = ssh_config_parse_uri(cp, &username, &hostname, &port, false);
- /* The rest of the list needs to be passed on */
- if (endp != NULL) {
- next = strdup(endp + 1);
- @@ -475,7 +475,7 @@ ssh_config_parse_proxy_jump(ssh_session session, const char *s, bool do_parsing)
- }
- } else {
- /* The rest is just sanity-checked to avoid failures later */
- - rv = ssh_config_parse_uri(cp, NULL, NULL, NULL);
- + rv = ssh_config_parse_uri(cp, NULL, NULL, NULL, false);
- }
- if (rv != SSH_OK) {
- goto out;
- diff --git a/src/config_parser.c b/src/config_parser.c
- index b8b94611af54f5524e16afc14f2517c3dbadfdd3..d4b2d2c3b74db7ff564ebfdfd09ec31a9ae485be 100644
- --- a/src/config_parser.c
- +++ b/src/config_parser.c
- @@ -162,9 +162,10 @@ int ssh_config_get_yesno(char **str, int notfound)
- }
-
- int ssh_config_parse_uri(const char *tok,
- - char **username,
- - char **hostname,
- - char **port)
- + char **username,
- + char **hostname,
- + char **port,
- + bool ignore_port)
- {
- char *endp = NULL;
- long port_n;
- @@ -210,12 +211,17 @@ int ssh_config_parse_uri(const char *tok,
- if (endp == NULL) {
- goto error;
- }
- - } else {
- - /* Hostnames or aliases expand to the last colon or to the end */
- + } else if (!ignore_port) {
- + /* Hostnames or aliases expand to the last colon (if port is requested)
- + * or to the end */
- endp = strrchr(tok, ':');
- if (endp == NULL) {
- endp = strchr(tok, '\0');
- }
- + } else {
- + /* If no port is requested, expand to the end of line
- + * (to accommodate the IPv6 addresses) */
- + endp = strchr(tok, '\0');
- }
- if (tok == endp) {
- /* Zero-length hostnames are not valid */
- diff --git a/src/options.c b/src/options.c
- index 3851145557a9ef6fd21a664e5bce7506143873c5..b3ecffe15f23e51c5217a58a28dc15256666efa6 100644
- --- a/src/options.c
- +++ b/src/options.c
- @@ -516,17 +516,11 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
- ssh_set_error_invalid(session);
- return -1;
- } else {
- - char *username = NULL, *hostname = NULL, *port = NULL;
- - rc = ssh_config_parse_uri(value, &username, &hostname, &port);
- + char *username = NULL, *hostname = NULL;
- + rc = ssh_config_parse_uri(value, &username, &hostname, NULL, true);
- if (rc != SSH_OK) {
- return -1;
- }
- - if (port != NULL) {
- - SAFE_FREE(username);
- - SAFE_FREE(hostname);
- - SAFE_FREE(port);
- - return -1;
- - }
- if (username != NULL) {
- SAFE_FREE(session->opts.username);
- session->opts.username = username;
|