From patchwork Wed Sep 25 18:57:08 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: William Martin X-Patchwork-Id: 15290 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 86C5B44A1EE for ; Wed, 25 Sep 2019 22:04:29 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 5ACD5689C64; Wed, 25 Sep 2019 22:04:29 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-pl1-f195.google.com (mail-pl1-f195.google.com [209.85.214.195]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9E7EB688345 for ; Wed, 25 Sep 2019 22:04:23 +0300 (EEST) Received: by mail-pl1-f195.google.com with SMTP id q15so2934410pll.11 for ; Wed, 25 Sep 2019 12:04:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=48voM35a6qqaavK84QC1CR56MJWL292R75K7Ikh6hn8=; b=sQ5CuW3kK1vkEKUmxjgTyudAQw4FB0vwgSuAUwDCpXMszyRrZtaqAPeIHqGZpiKxki F2pP1wkw3qFMIsx9FW1gxzEnd10wwNO2thlX4cLnbVoHXDkn5ES9Zycyd9BhuxkiQBzg CiaAEIpGz1EQdWBsZtRuN27RT0WKcbKm6RVZmUt7CLwKrf/7xhdVFfedyjPA/eOGYueW 0ARdTlQ69Ks1JDOaGb0m7XLBgOAx0gPVDbJtLs70V7Zd9kkhrUlGu3Ygc+PxgBWU0mCv CmU+gRzXBpkxcxw92EScerRIN8PM2C+KPxOnH2rRKKUtZp7vah+Eo1jDnZjuuoCMLFnn yWMA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=48voM35a6qqaavK84QC1CR56MJWL292R75K7Ikh6hn8=; b=tLlmuC2ZuWcpNVpxEot98Ofle1FUIcclWG7pz5mOIlK1oKxgrsA8FdIa23nXzE76K3 KRPqzuwTw/0Gs+y/4gu5RYJ3vJwmSDJIZSQq9FF0gBYY9aegZHrECPebygwXXQaMv9Eg PylqTY2s3mdsYfJoYQNpV1UtzTLzCqo92B0BA0T7icQKAOohOs3MfYro/1AeID6AYj0b 8GVKJZj6wYeYcif66i3uxNdwdrD1Be91xmg1+/AWJ9IPCUh4dlLLW2ZC0FDSbR9LDt+3 APOYirCPS8Gcdm+2g56oNXLr/lTaifxq8e+y86C+jaFz0qq0JBQJ9eqi63ZMtAcwqcLc dR3w== X-Gm-Message-State: APjAAAWqjOVLZcJCxgu/TcaH2kKg09eowNUfFiDfBBg3Nn/sTvNFYRAY TQ1wH1odMjzYCSKD2In7JJ7buFk8 X-Google-Smtp-Source: APXvYqzWx737OqSA2DsHL2lnAbVOJ+n/d4qxbgATwzS6SgTKuJQ8KrmyMUfqXIqZdo1kmONFV11yMw== X-Received: by 2002:a17:902:9a81:: with SMTP id w1mr10913068plp.124.1569437830403; Wed, 25 Sep 2019 11:57:10 -0700 (PDT) Received: from C02XG1KUJGH8.corp.yahoo.com (nat-dip17.cfw-a-gci.corp.yahoo.com. [209.131.62.126]) by smtp.gmail.com with ESMTPSA id d5sm3501289pjw.31.2019.09.25.11.57.09 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 25 Sep 2019 11:57:09 -0700 (PDT) From: William Martin To: ffmpeg-devel@ffmpeg.org Date: Wed, 25 Sep 2019 11:57:08 -0700 Message-Id: <20190925185708.70924-1-unique.will.martin@gmail.com> X-Mailer: git-send-email 2.20.1 (Apple Git-117) MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] Adding a flag to give user the option to have ffmpeg fail instead of warn when mismatches are found in rtmp url stream or application names. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Will Martin Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Will Martin Motivation: When running multiple rtmp ingest on the same machine on the same port, users may want to explicitly forbid mismatched rtmp streams from successfully completing handshakes. This patch allows for such enforcement Signed-off-by: Will Martin --- libavformat/librtmp.c | 2 ++ libavformat/rtmpproto.c | 24 ++++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/libavformat/librtmp.c b/libavformat/librtmp.c index 43013e46e0..00b49666fd 100644 --- a/libavformat/librtmp.c +++ b/libavformat/librtmp.c @@ -52,6 +52,7 @@ typedef struct LibRTMPContext { int live; char *temp_filename; int buffer_size; + bool strict_paths; } LibRTMPContext; static void rtmp_log(int level, const char *fmt, va_list args) @@ -333,6 +334,7 @@ static const AVOption options[] = { {"rtmp_swfurl", "URL of the SWF player. By default no value will be sent", OFFSET(swfurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, {"rtmp_swfverify", "URL to player swf file, compute hash/size automatically. (unimplemented)", OFFSET(swfverify), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC}, {"rtmp_tcurl", "URL of the target stream. Defaults to proto://host[:port]/app.", OFFSET(tcurl), AV_OPT_TYPE_STRING, {.str = NULL }, 0, 0, DEC|ENC}, + {"rtmp_strict_paths", "Error instead of warn for mismatch on stream or application path in url", OFFSET(strict_paths), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, DEC}, #if CONFIG_NETWORK {"rtmp_buffer_size", "set buffer size in bytes", OFFSET(buffer_size), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, DEC|ENC }, #endif diff --git a/libavformat/rtmpproto.c b/libavformat/rtmpproto.c index b741e421af..dded3b6028 100644 --- a/libavformat/rtmpproto.c +++ b/libavformat/rtmpproto.c @@ -129,6 +129,7 @@ typedef struct RTMPContext { char auth_params[500]; int do_reconnect; int auth_tried; + int strict_paths; ///< If true, enforce strict string matching on rtmp stream and application } RTMPContext; #define PLAYER_KEY_OPEN_PART_LEN 30 ///< length of partial key used for first client digest signing @@ -477,9 +478,16 @@ static int read_connect(URLContext *s, RTMPContext *rt) "app", tmpstr, sizeof(tmpstr)); if (ret) av_log(s, AV_LOG_WARNING, "App field not found in connect\n"); - if (!ret && strcmp(tmpstr, rt->app)) - av_log(s, AV_LOG_WARNING, "App field don't match up: %s <-> %s\n", + if (!ret && strcmp(tmpstr, rt->app)) { + if (rt->strict_paths) { + av_log(s, AV_LOG_ERROR, "App field don't match up: %s <-> %s. " + "Exiting since rtmp_strict_paths provided\n", tmpstr, rt->app); + return AVERROR(EIO); + } else { + av_log(s, AV_LOG_WARNING, "App field don't match up: %s <-> %s\n", tmpstr, rt->app); + } + } ff_rtmp_packet_destroy(&pkt); // Send Window Acknowledgement Size (as defined in specification) @@ -1946,9 +1954,16 @@ static int send_invoke_response(URLContext *s, RTMPPacket *pkt) pchar = s->filename; } pchar++; - if (strcmp(pchar, filename)) - av_log(s, AV_LOG_WARNING, "Unexpected stream %s, expecting" + if (strcmp(pchar, filename)) { + if (rt->strict_paths) { + av_log(s, AV_LOG_ERROR, "Unexpected stream %s, expecting %s. " + "Exiting since rtmp_strict_paths provided.\n", filename, pchar); + return AVERROR(EIO); + } else { + av_log(s, AV_LOG_WARNING, "Unexpected stream %s, expecting" " %s\n", filename, pchar); + } + } } rt->state = STATE_RECEIVING; } @@ -3112,6 +3127,7 @@ static const AVOption rtmp_options[] = { {"rtmp_listen", "Listen for incoming rtmp connections", OFFSET(listen), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC, "rtmp_listen" }, {"listen", "Listen for incoming rtmp connections", OFFSET(listen), AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX, DEC, "rtmp_listen" }, {"timeout", "Maximum timeout (in seconds) to wait for incoming connections. -1 is infinite. Implies -rtmp_listen 1", OFFSET(listen_timeout), AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX, DEC, "rtmp_listen" }, + {"rtmp_strict_paths", "Error instead of warn for mismatch on stream or application path in url", OFFSET(strict_paths), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, DEC}, { NULL }, };