about summary refs log tree commit diff stats
path: root/src/xmpp
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2022-02-01 17:13:50 +0100
committerGitHub <noreply@github.com>2022-02-01 17:13:50 +0100
commit832f28bcb2989a7e9f93dd75009a6dc4ef80b581 (patch)
tree6ed3e152a3891b9d570a0569ab89a013332438fa /src/xmpp
parent9a1311a82660fc0ce2bacc64d5324b90b3345476 (diff)
parentad87bdffc286aa4a32b350869c2e70af9630c0a2 (diff)
downloadprofani-tty-832f28bcb2989a7e9f93dd75009a6dc4ef80b581.tar.gz
Merge pull request #1632 from profanity-im/fix-split-url
Fix `_split_url()`
Diffstat (limited to 'src/xmpp')
-rw-r--r--src/xmpp/connection.c27
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;