diff --git a/plugins/obs-outputs/librtmp/parseurl.c b/plugins/obs-outputs/librtmp/parseurl.c index ee07c5036..7a4787df8 100644 --- a/plugins/obs-outputs/librtmp/parseurl.c +++ b/plugins/obs-outputs/librtmp/parseurl.c @@ -27,7 +27,7 @@ int RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port, AVal *app) { - char *p, *end, *col, /* *ques, */ *slash; + char *p, *end, *col, /* *ques, */ *slash, *v6; RTMP_Log(RTMP_LOGDEBUG, "Parsing..."); @@ -83,9 +83,10 @@ parsehost: } end = p + strlen(p); - col = strchr(p, ':'); + v6 = strchr(p, ']'); // ques = strchr(p, '?'); slash = strchr(p, '/'); + col = strchr((v6 && v6 < slash) ? v6 : p, ':'); { int hostlen; diff --git a/plugins/obs-outputs/librtmp/rtmp.c b/plugins/obs-outputs/librtmp/rtmp.c index d18e9a42f..b0f6e9afb 100644 --- a/plugins/obs-outputs/librtmp/rtmp.c +++ b/plugins/obs-outputs/librtmp/rtmp.c @@ -646,11 +646,12 @@ add_addr_info(struct sockaddr_storage *service, socklen_t *addrlen, AVal *host, { char *hostname; int ret = TRUE; - if (host->av_val[host->av_len]) + if (host->av_val[host->av_len] || host->av_val[0] == '[') { - hostname = malloc(host->av_len+1); - memcpy(hostname, host->av_val, host->av_len); - hostname[host->av_len] = '\0'; + int v6 = host->av_val[0] == '['; + hostname = malloc(host->av_len+1 - v6 * 2); + memcpy(hostname, host->av_val + v6, host->av_len - v6 * 2); + hostname[host->av_len - v6 * 2] = '\0'; } else {