From patchwork Sat Apr 14 00:14:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: rshaffer@tunein.com X-Patchwork-Id: 8440 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.1.70 with SMTP id c67csp1326063jad; Fri, 13 Apr 2018 17:22:32 -0700 (PDT) X-Google-Smtp-Source: AIpwx48RW41joy6kcxZ5lUy7yxMYWEjKVkd6vA9XojZmlUQehUNeSQ/Azf2X7rK2Gz6/AbZE3b7V X-Received: by 10.28.106.1 with SMTP id f1mr5318750wmc.59.1523665352680; Fri, 13 Apr 2018 17:22:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523665352; cv=none; d=google.com; s=arc-20160816; b=hghCTHmp6aa5ZrbHZHim7zBB0OouKwhzMVrRD8PfWZXYpWvVfo8kOZW/6qRTnjdiqD LQJ4jP9XV8T0JZb43cvqYpJ31VWM4NlC/7DFPri3SZz6vGywXVW9oAmLE67BLBjpk5AB jJAxj5WgFg5dMiYcsysRWD0w8H0AJya16peRQfalu7IN2eu9JfUm4O9G16ugwLrOBoYj ao/GJ17IT0R2qU2svrw+QYHpsXRQiz2nlrq/9DnfYQY04x5wkcO/ngQ/4mXpj+Ng8q4j uScB7n8DaczeNQteNvlvlLdOQKUjR1Ov3pQIQ/nM3iHYwA2dBG4FPfs71XxMTbi+RNM1 81cw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=G/rAoo3eY5znnInVm5m2T0q93FpIM65TayjwqWwWyqI=; b=AQSkueAMyFH5PHcl5F+ef3dCP+nkRGi6OtV8nu5EkNb2zsMbdR0PmQCdGG1UUIl54P sPlDtFHXLiBLJrTXMENO2F2zOd3pdERY70S2meXBPUvgK6yFYElX9akpGz+jolclYGXh Bvhb+d/16iNrvGqdd0M4JUFSXuI06LPnXTMKTRHKyw8/O6lmk4+M8zqALJH8WlG659Ba Q/CyfM8QeWmsnAemPhHzA67XJvQ4j9W2Fdnhv8HRG+CK5ttvr3OkZS039ducH0EWxJ2i 453fAkY8snOleM7gsXwvwDvz8Yn5C4qeYTukcYCQ+X/jnJ5mMIzjIDvxUeu3iSh6KdBF BGnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@tunein-com.20150623.gappssmtp.com header.s=20150623 header.b=LM6BGgBY; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 199si1120718wmq.22.2018.04.13.17.22.32; Fri, 13 Apr 2018 17:22:32 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@tunein-com.20150623.gappssmtp.com header.s=20150623 header.b=LM6BGgBY; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id F2F27689C34; Sat, 14 Apr 2018 03:22:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-yw0-f178.google.com (mail-yw0-f178.google.com [209.85.161.178]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8CC86689C34 for ; Sat, 14 Apr 2018 03:21:59 +0300 (EEST) Received: by mail-yw0-f178.google.com with SMTP id v68so4831682ywg.13 for ; Fri, 13 Apr 2018 17:22:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=tunein-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=l6YW7e0DmrH9dpjEFhBN3eGIrkPShgrES8LQo1EBNJA=; b=LM6BGgBYOr6DlyJaU6vr+aSFdu1yc/Wy44In9zikmmG87tBjBRhLdZR0QFSG4CeSPE +QWyTt5JuTcL4Mv22BWce2szY3LkzOh7UlLNgiwqt61stE1qSnfUk3ufSQpV84DZXlfB u1YmcGAMC0NoVfeMqyqWKb5oBoFVMdsoMVCeHUhq28gWzWKLTSGWGBHMfcqIHlBVZsUV EzFM2+MWCdLH3IL/+cDZrHYWDzZJkSf9sJYCFsBYGIrTFKKVkY3f4aF2DH5tNsHB87Wf mAoPV8MAPV2zwIIrwcpZ0PZaXeiKy1IHfptXlMTLJmooT5k2fcXZg+U37bWvUGvz/tI7 c5cQ== 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:in-reply-to :references; bh=l6YW7e0DmrH9dpjEFhBN3eGIrkPShgrES8LQo1EBNJA=; b=e9k/SRhC6YTPx5yUdheTeOZc9jvqb3WcHgC0QbDBeK4l5cUFZtZfppCNnrj5+N/8mx W3Fc5tqH/X9CzM8Ny8biF9VZbR9xelZw57jY8MKT0WqQmZUOBO5tUUkjmwYqyFksmRaU h+OwlpC+qXdr42vO0PcJd3huKkA6b4e19ULrOe8uCRAXg7cB0/4ViCwUao35xy3P2lfb gACJIDptMyfEVk+5E/pXU6otOmmuZPnzhQI/PmdmmBOHmjIUonKtKbvGqAYk/JRTkuMq Z123R5Cndi8GjG2IcxmULZF3f/96q8OQ6a2OBFVqnDO5g0BhzEnxqdNAL0kXYB6MzMvb kKsQ== X-Gm-Message-State: ALQs6tCL2AbDZ4u+asznTEnkRBPmaqc1ud6dAiop3p10zHaRn4IWP1UV mWqqCLpaUp+Ou1LIxYd5rA76UwyC X-Received: by 10.129.69.28 with SMTP id s28mr5031206ywa.118.1523664875198; Fri, 13 Apr 2018 17:14:35 -0700 (PDT) Received: from 000984.tunein.corp ([38.140.202.59]) by smtp.gmail.com with ESMTPSA id e187sm3002655ywb.23.2018.04.13.17.14.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 13 Apr 2018 17:14:34 -0700 (PDT) From: rshaffer@tunein.com To: ffmpeg-devel@ffmpeg.org Date: Fri, 13 Apr 2018 17:14:29 -0700 Message-Id: <20180414001429.16703-1-rshaffer@tunein.com> X-Mailer: git-send-email 2.15.1 (Apple Git-101) In-Reply-To: <20180410184718.41066-1-rshaffer@tunein.com> References: <20180410184718.41066-1-rshaffer@tunein.com> Subject: [FFmpeg-devel] [PATCH v2] avformat/hls: clean up duplicate option fields 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: Richard Shaffer MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Richard Shaffer The HLSContext struct contains fields which duplicate the data stored in the avio_opts field. This change removes those fields in favor of avio_opts, and updates the code accordingly. --- The original patch caused the buffer pointed to by new_cookies in open_url to be leaked. The only thing that buffer is used for is to store the value until it can be passed to av_dict_set. To fix the leak, v2 of the patch simply calls av_dict_set with the AV_DICT_DONT_STRDUP_VAL flag, so that the dictionary takes ownership of the memory instead of copying it again. libavformat/hls.c | 74 +++++++------------------------------------------------ 1 file changed, 9 insertions(+), 65 deletions(-) diff --git a/libavformat/hls.c b/libavformat/hls.c index 1257cd101c..d6158c0ada 100644 --- a/libavformat/hls.c +++ b/libavformat/hls.c @@ -202,11 +202,6 @@ typedef struct HLSContext { int64_t first_timestamp; int64_t cur_timestamp; AVIOInterruptCB *interrupt_callback; - char *referer; ///< holds HTTP referer set as an AVOption to the HTTP protocol context - char *user_agent; ///< holds HTTP user agent set as an AVOption to the HTTP protocol context - char *cookies; ///< holds HTTP cookie values set in either the initial response or as an AVOption to the HTTP protocol context - char *headers; ///< holds HTTP headers set as an AVOption to the HTTP protocol context - char *http_proxy; ///< holds the address of the HTTP proxy server AVDictionary *avio_opts; int strict_std_compliance; char *allowed_extensions; @@ -267,10 +262,6 @@ static void free_playlist_list(HLSContext *c) av_free(pls); } av_freep(&c->playlists); - av_freep(&c->cookies); - av_freep(&c->user_agent); - av_freep(&c->headers); - av_freep(&c->http_proxy); c->n_playlists = 0; } @@ -593,14 +584,6 @@ static int ensure_playlist(HLSContext *c, struct playlist **pls, const char *url return 0; } -static void update_options(char **dest, const char *name, void *src) -{ - av_freep(dest); - av_opt_get(src, name, AV_OPT_SEARCH_CHILDREN, (uint8_t**)dest); - if (*dest && !strlen(*dest)) - av_freep(dest); -} - static int open_url_keepalive(AVFormatContext *s, AVIOContext **pb, const char *url) { @@ -684,12 +667,8 @@ static int open_url(AVFormatContext *s, AVIOContext **pb, const char *url, if (!(s->flags & AVFMT_FLAG_CUSTOM_IO)) av_opt_get(*pb, "cookies", AV_OPT_SEARCH_CHILDREN, (uint8_t**)&new_cookies); - if (new_cookies) { - av_free(c->cookies); - c->cookies = new_cookies; - } - - av_dict_set(&opts, "cookies", c->cookies, 0); + if (new_cookies) + av_dict_set(&opts, "cookies", new_cookies, AV_DICT_DONT_STRDUP_VAL); } av_dict_free(&tmp); @@ -736,14 +715,7 @@ static int parse_playlist(HLSContext *c, const char *url, if (!in) { AVDictionary *opts = NULL; - /* Some HLS servers don't like being sent the range header */ - av_dict_set(&opts, "seekable", "0", 0); - - // broker prior HTTP options that should be consistent across requests - av_dict_set(&opts, "user_agent", c->user_agent, 0); - av_dict_set(&opts, "cookies", c->cookies, 0); - av_dict_set(&opts, "headers", c->headers, 0); - av_dict_set(&opts, "http_proxy", c->http_proxy, 0); + av_dict_copy(&opts, c->avio_opts, 0); if (c->http_persistent) av_dict_set(&opts, "multiple_requests", "1", 0); @@ -1169,14 +1141,6 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, int ret; int is_http = 0; - // broker prior HTTP options that should be consistent across requests - av_dict_set(&opts, "user_agent", c->user_agent, 0); - av_dict_set(&opts, "referer", c->referer, 0); - av_dict_set(&opts, "cookies", c->cookies, 0); - av_dict_set(&opts, "headers", c->headers, 0); - av_dict_set(&opts, "http_proxy", c->http_proxy, 0); - av_dict_set(&opts, "seekable", "0", 0); - if (c->http_persistent) av_dict_set(&opts, "multiple_requests", "1", 0); @@ -1193,7 +1157,6 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, if (seg->key_type == KEY_NONE) { ret = open_url(pls->parent, in, seg->url, c->avio_opts, opts, &is_http); } else if (seg->key_type == KEY_AES_128) { - AVDictionary *opts2 = NULL; char iv[33], key[33], url[MAX_URL_SIZE]; if (strcmp(seg->key, pls->key_url)) { AVIOContext *pb = NULL; @@ -1218,14 +1181,10 @@ static int open_input(HLSContext *c, struct playlist *pls, struct segment *seg, else snprintf(url, sizeof(url), "crypto:%s", seg->url); - av_dict_copy(&opts2, c->avio_opts, 0); - av_dict_set(&opts2, "key", key, 0); - av_dict_set(&opts2, "iv", iv, 0); - - ret = open_url(pls->parent, in, url, opts2, opts, &is_http); - - av_dict_free(&opts2); + av_dict_set(&opts, "key", key, 0); + av_dict_set(&opts, "iv", iv, 0); + ret = open_url(pls->parent, in, url, c->avio_opts, opts, &is_http); if (ret < 0) { goto cleanup; } @@ -1781,7 +1740,6 @@ static int hls_close(AVFormatContext *s) static int hls_read_header(AVFormatContext *s) { - void *u = (s->flags & AVFMT_FLAG_CUSTOM_IO) ? NULL : s->pb; HLSContext *c = s->priv_data; int ret = 0, i; int highest_cur_seq_no = 0; @@ -1794,29 +1752,15 @@ static int hls_read_header(AVFormatContext *s) c->first_timestamp = AV_NOPTS_VALUE; c->cur_timestamp = AV_NOPTS_VALUE; - if (u) { - // get the previous user agent & set back to null if string size is zero - update_options(&c->user_agent, "user_agent", u); - - // get the previous cookies & set back to null if string size is zero - update_options(&c->cookies, "cookies", u); - - // get the previous headers & set back to null if string size is zero - update_options(&c->headers, "headers", u); - - // get the previous http proxt & set back to null if string size is zero - update_options(&c->http_proxy, "http_proxy", u); - } - - if ((ret = parse_playlist(c, s->url, NULL, s->pb)) < 0) - goto fail; - if ((ret = save_avio_options(s)) < 0) goto fail; /* Some HLS servers don't like being sent the range header */ av_dict_set(&c->avio_opts, "seekable", "0", 0); + if ((ret = parse_playlist(c, s->url, NULL, s->pb)) < 0) + goto fail; + if (c->n_variants == 0) { av_log(NULL, AV_LOG_WARNING, "Empty playlist\n"); ret = AVERROR_EOF;