diff options
author | Michael Vetter <jubalh@iodoru.org> | 2022-02-01 17:13:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-01 17:13:50 +0100 |
commit | 832f28bcb2989a7e9f93dd75009a6dc4ef80b581 (patch) | |
tree | 6ed3e152a3891b9d570a0569ab89a013332438fa /src | |
parent | 9a1311a82660fc0ce2bacc64d5324b90b3345476 (diff) | |
parent | ad87bdffc286aa4a32b350869c2e70af9630c0a2 (diff) | |
download | profani-tty-832f28bcb2989a7e9f93dd75009a6dc4ef80b581.tar.gz |
Merge pull request #1632 from profanity-im/fix-split-url
Fix `_split_url()`
Diffstat (limited to 'src')
-rw-r--r-- | src/xmpp/connection.c | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/src/xmpp/connection.c b/src/xmpp/connection.c index c04f9df2..3b389814 100644 --- a/src/xmpp/connection.c +++ b/src/xmpp/connection.c @@ -929,14 +929,31 @@ _split_url(const char* alturi, gchar** host, gint* port) ptrdiff_t hostlen; /* search ':' from start and end * if `first` matches `last` it's a `hostname:port` combination - * if `first` is different than `last` it's `[ip:v6]:port` + * if `first` is different than `last` it's `[ip:v6]` or `[ip:v6]:port` */ char* first = strchr(alturi, ':'); char* last = strrchr(alturi, ':'); - if (first && first == last) { - hostlen = last - alturi; - if (!strtoi_range(last + 1, port, 1, 65535, NULL)) - return FALSE; + if (first) { + if (first == last) { + hostlen = last - alturi; + if (!strtoi_range(last + 1, port, 1, 65535, NULL)) + return FALSE; + } else { + /* IPv6 handling */ + char* bracket = strrchr(alturi, ']'); + if (!bracket) + return FALSE; + if (bracket > last) { + /* `[ip:v6]` */ + hostlen = strlen(alturi) + 1; + *port = 0; + } else { + /* `[ip:v6]:port` */ + hostlen = last - alturi; + if (!strtoi_range(last + 1, port, 1, 65535, NULL)) + return FALSE; + } + } } else { hostlen = strlen(alturi) + 1; *port = 0; |