Compare commits

...

3 Commits

Author SHA1 Message Date
Marvin Scholz d1f31a829d avformat/rtsp: fix leading space in RTSP reason
When parsing the RTSP message reason, the whole remainder
after parsing the status code was used, which would lead to
a leading space in the parsed reason string.

(cherry picked from commit e63e040f0c)
Signed-off-by: Marvin Scholz <epirat07@gmail.com>
2025-10-16 15:57:19 +02:00
Marvin Scholz 1e56c51d3b avformat/rtsp: do not log invalid values
When reading fails the first time, ch would be uninitialized and
printed in the log message. Instead check for an error early and
log it properly.

(cherry picked from commit 2ed47ab725)
Signed-off-by: Marvin Scholz <epirat07@gmail.com>
2025-10-16 15:57:19 +02:00
Marvin Scholz 45fcd5567a avformat/http: Handle IPv6 Zone ID in hostname
When using a literal IPv6 address as hostname, it can contain a Zone ID
especially in the case of link-local addresses. Sending this to the
server in the Host header is not useful to the server and in some cases
servers refuse such requests.

To prevent any such issues, strip the Zone ID from the address if it's
an IPv6 address. This also removes it for the Cookies lookup.

Based on a patch by: Daniel N Pettersson <danielnp@axis.com>

(cherry picked from commit 5cb6d2221a)
Signed-off-by: Marvin Scholz <epirat07@gmail.com>
2025-10-16 15:57:19 +02:00
2 changed files with 16 additions and 4 deletions

View File

@ -24,6 +24,7 @@
#include "config.h" #include "config.h"
#include "config_components.h" #include "config_components.h"
#include <string.h>
#include <time.h> #include <time.h>
#if CONFIG_ZLIB #if CONFIG_ZLIB
#include <zlib.h> #include <zlib.h>
@ -214,7 +215,7 @@ static int http_open_cnx_internal(URLContext *h, AVDictionary **options)
const char *path, *proxy_path, *lower_proto = "tcp", *local_path; const char *path, *proxy_path, *lower_proto = "tcp", *local_path;
char *env_http_proxy, *env_no_proxy; char *env_http_proxy, *env_no_proxy;
char *hashmark; char *hashmark;
char hostname[1024], hoststr[1024], proto[10]; char hostname[1024], hoststr[1024], proto[10], tmp_host[1024];
char auth[1024], proxyauth[1024] = ""; char auth[1024], proxyauth[1024] = "";
char path1[MAX_URL_SIZE], sanitized_path[MAX_URL_SIZE + 1]; char path1[MAX_URL_SIZE], sanitized_path[MAX_URL_SIZE + 1];
char buf[1024], urlbuf[MAX_URL_SIZE]; char buf[1024], urlbuf[MAX_URL_SIZE];
@ -224,7 +225,14 @@ static int http_open_cnx_internal(URLContext *h, AVDictionary **options)
av_url_split(proto, sizeof(proto), auth, sizeof(auth), av_url_split(proto, sizeof(proto), auth, sizeof(auth),
hostname, sizeof(hostname), &port, hostname, sizeof(hostname), &port,
path1, sizeof(path1), s->location); path1, sizeof(path1), s->location);
ff_url_join(hoststr, sizeof(hoststr), NULL, NULL, hostname, port, NULL);
av_strlcpy(tmp_host, hostname, sizeof(tmp_host));
// In case of an IPv6 address, we need to strip the Zone ID,
// if any. We do it at the first % sign, as percent encoding
// can be used in the Zone ID itself.
if (strchr(tmp_host, ':'))
tmp_host[strcspn(tmp_host, "%")] = '\0';
ff_url_join(hoststr, sizeof(hoststr), NULL, NULL, tmp_host, port, NULL);
env_http_proxy = getenv_utf8("http_proxy"); env_http_proxy = getenv_utf8("http_proxy");
proxy_path = s->http_proxy ? s->http_proxy : env_http_proxy; proxy_path = s->http_proxy ? s->http_proxy : env_http_proxy;

View File

@ -1239,9 +1239,12 @@ start:
q = buf; q = buf;
for (;;) { for (;;) {
ret = ffurl_read_complete(rt->rtsp_hd, &ch, 1); ret = ffurl_read_complete(rt->rtsp_hd, &ch, 1);
if (ret != 1) {
ret = (ret < 0) ? ret : AVERROR(EIO);
av_log(s, AV_LOG_WARNING, "Failed reading RTSP data: %s\n", av_err2str(ret));
return ret;
}
av_log(s, AV_LOG_TRACE, "ret=%d c=%02x [%c]\n", ret, ch, ch); av_log(s, AV_LOG_TRACE, "ret=%d c=%02x [%c]\n", ret, ch, ch);
if (ret != 1)
return ret < 0 ? ret : AVERROR(EIO);
if (ch == '\n') if (ch == '\n')
break; break;
if (ch == '$' && q == buf) { if (ch == '$' && q == buf) {
@ -1271,6 +1274,7 @@ start:
if (!strncmp(buf1, "RTSP/", 5)) { if (!strncmp(buf1, "RTSP/", 5)) {
get_word(buf1, sizeof(buf1), &p); get_word(buf1, sizeof(buf1), &p);
reply->status_code = atoi(buf1); reply->status_code = atoi(buf1);
p += strspn(p, SPACE_CHARS);
av_strlcpy(reply->reason, p, sizeof(reply->reason)); av_strlcpy(reply->reason, p, sizeof(reply->reason));
} else { } else {
av_strlcpy(reply->reason, buf1, sizeof(reply->reason)); // method av_strlcpy(reply->reason, buf1, sizeof(reply->reason)); // method