diff mbox

[FFmpeg-devel] fix memory leak of parsing dash MPD

Message ID 20180419122823.84787-1-guikunzhi@163.com
State Accepted
Commit 8ea8be595166cdae73bf3f8bee2f28bc94f1c988
Headers show

Commit Message

guikunzhi April 19, 2018, 12:28 p.m. UTC
Signed-off-by: guikunzhi <guikunzhi@163.com>
---
 libavformat/dashdec.c | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

Comments

Liu Steven April 20, 2018, 3:33 a.m. UTC | #1
> On 19 Apr 2018, at 20:28, guikunzhi <guikunzhi@163.com> wrote:
> 
> Signed-off-by: guikunzhi <guikunzhi@163.com>
> ---
> libavformat/dashdec.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
> index 6304ad933b..b9f1a40dfe 100644
> --- a/libavformat/dashdec.c
> +++ b/libavformat/dashdec.c
> @@ -706,6 +706,7 @@ static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur
>     char *baseurl = NULL;
>     char *root_url = NULL;
>     char *text = NULL;
> +    char *tmp = NULL;
> 
>     int isRootHttp = 0;
>     char token ='/';
> @@ -735,9 +736,11 @@ static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur
>         goto end;
>     }
>     av_strlcpy(text, url, strlen(url)+1);
> -    while (mpdName = av_strtok(text, "/", &text))  {
> +    tmp = text;
> +    while (mpdName = av_strtok(tmp, "/", &tmp))  {
>         size = strlen(mpdName);
>     }
> +    av_free(text);
> 
>     path = av_mallocz(tmp_max_url_size);
>     tmp_str = av_mallocz(tmp_max_url_size);
> @@ -796,6 +799,7 @@ end:
>     }
>     av_free(path);
>     av_free(tmp_str);
> +    xmlFree(baseurl);
>     return updated;
> 
> }
> @@ -1121,6 +1125,7 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
>     xmlNodePtr root_element = NULL;
>     xmlNodePtr node = NULL;
>     xmlNodePtr period_node = NULL;
> +    xmlNodePtr tmp_node = NULL;
>     xmlNodePtr mpd_baseurl_node = NULL;
>     xmlNodePtr period_baseurl_node = NULL;
>     xmlNodePtr period_segmenttemplate_node = NULL;
> @@ -1215,8 +1220,10 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
>             xmlFree(val);
>         }
> 
> -        mpd_baseurl_node = find_child_node_by_name(node, "BaseURL");
> -        if (!mpd_baseurl_node) {
> +        tmp_node = find_child_node_by_name(node, "BaseURL");
> +        if (tmp_node) {
> +            mpd_baseurl_node = xmlCopyNode(tmp_node,1);
> +        } else {
>             mpd_baseurl_node = xmlNewNode(NULL, "BaseURL");
>         }
> 
> @@ -1270,6 +1277,7 @@ cleanup:
>         /*free the document */
>         xmlFreeDoc(doc);
>         xmlCleanupParser();
> +        xmlFreeNode(mpd_baseurl_node);
>     }
> 
>     av_free(new_url);
> -- 
> 2.14.3 (Apple Git-98)
> 
> 

LGTM

Thanks
Steven
Liu Steven April 26, 2018, 5:17 a.m. UTC | #2
> On 20 Apr 2018, at 11:33, Steven Liu <lq@chinaffmpeg.org> wrote:
> 
> 
> 
>> On 19 Apr 2018, at 20:28, guikunzhi <guikunzhi@163.com> wrote:
>> 
>> Signed-off-by: guikunzhi <guikunzhi@163.com>
>> ---
>> libavformat/dashdec.c | 14 +++++++++++---
>> 1 file changed, 11 insertions(+), 3 deletions(-)
>> 
>> diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
>> index 6304ad933b..b9f1a40dfe 100644
>> --- a/libavformat/dashdec.c
>> +++ b/libavformat/dashdec.c
>> @@ -706,6 +706,7 @@ static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur
>>    char *baseurl = NULL;
>>    char *root_url = NULL;
>>    char *text = NULL;
>> +    char *tmp = NULL;
>> 
>>    int isRootHttp = 0;
>>    char token ='/';
>> @@ -735,9 +736,11 @@ static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur
>>        goto end;
>>    }
>>    av_strlcpy(text, url, strlen(url)+1);
>> -    while (mpdName = av_strtok(text, "/", &text))  {
>> +    tmp = text;
>> +    while (mpdName = av_strtok(tmp, "/", &tmp))  {
>>        size = strlen(mpdName);
>>    }
>> +    av_free(text);
>> 
>>    path = av_mallocz(tmp_max_url_size);
>>    tmp_str = av_mallocz(tmp_max_url_size);
>> @@ -796,6 +799,7 @@ end:
>>    }
>>    av_free(path);
>>    av_free(tmp_str);
>> +    xmlFree(baseurl);
>>    return updated;
>> 
>> }
>> @@ -1121,6 +1125,7 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
>>    xmlNodePtr root_element = NULL;
>>    xmlNodePtr node = NULL;
>>    xmlNodePtr period_node = NULL;
>> +    xmlNodePtr tmp_node = NULL;
>>    xmlNodePtr mpd_baseurl_node = NULL;
>>    xmlNodePtr period_baseurl_node = NULL;
>>    xmlNodePtr period_segmenttemplate_node = NULL;
>> @@ -1215,8 +1220,10 @@ static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
>>            xmlFree(val);
>>        }
>> 
>> -        mpd_baseurl_node = find_child_node_by_name(node, "BaseURL");
>> -        if (!mpd_baseurl_node) {
>> +        tmp_node = find_child_node_by_name(node, "BaseURL");
>> +        if (tmp_node) {
>> +            mpd_baseurl_node = xmlCopyNode(tmp_node,1);
>> +        } else {
>>            mpd_baseurl_node = xmlNewNode(NULL, "BaseURL");
>>        }
>> 
>> @@ -1270,6 +1277,7 @@ cleanup:
>>        /*free the document */
>>        xmlFreeDoc(doc);
>>        xmlCleanupParser();
>> +        xmlFreeNode(mpd_baseurl_node);
>>    }
>> 
>>    av_free(new_url);
>> -- 
>> 2.14.3 (Apple Git-98)
>> 
>> 
> 
> LGTM

Applied!

Thanks
Steven
diff mbox

Patch

diff --git a/libavformat/dashdec.c b/libavformat/dashdec.c
index 6304ad933b..b9f1a40dfe 100644
--- a/libavformat/dashdec.c
+++ b/libavformat/dashdec.c
@@ -706,6 +706,7 @@  static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur
     char *baseurl = NULL;
     char *root_url = NULL;
     char *text = NULL;
+    char *tmp = NULL;
 
     int isRootHttp = 0;
     char token ='/';
@@ -735,9 +736,11 @@  static int resolve_content_path(AVFormatContext *s, const char *url, int *max_ur
         goto end;
     }
     av_strlcpy(text, url, strlen(url)+1);
-    while (mpdName = av_strtok(text, "/", &text))  {
+    tmp = text;
+    while (mpdName = av_strtok(tmp, "/", &tmp))  {
         size = strlen(mpdName);
     }
+    av_free(text);
 
     path = av_mallocz(tmp_max_url_size);
     tmp_str = av_mallocz(tmp_max_url_size);
@@ -796,6 +799,7 @@  end:
     }
     av_free(path);
     av_free(tmp_str);
+    xmlFree(baseurl);
     return updated;
 
 }
@@ -1121,6 +1125,7 @@  static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
     xmlNodePtr root_element = NULL;
     xmlNodePtr node = NULL;
     xmlNodePtr period_node = NULL;
+    xmlNodePtr tmp_node = NULL;
     xmlNodePtr mpd_baseurl_node = NULL;
     xmlNodePtr period_baseurl_node = NULL;
     xmlNodePtr period_segmenttemplate_node = NULL;
@@ -1215,8 +1220,10 @@  static int parse_manifest(AVFormatContext *s, const char *url, AVIOContext *in)
             xmlFree(val);
         }
 
-        mpd_baseurl_node = find_child_node_by_name(node, "BaseURL");
-        if (!mpd_baseurl_node) {
+        tmp_node = find_child_node_by_name(node, "BaseURL");
+        if (tmp_node) {
+            mpd_baseurl_node = xmlCopyNode(tmp_node,1);
+        } else {
             mpd_baseurl_node = xmlNewNode(NULL, "BaseURL");
         }
 
@@ -1270,6 +1277,7 @@  cleanup:
         /*free the document */
         xmlFreeDoc(doc);
         xmlCleanupParser();
+        xmlFreeNode(mpd_baseurl_node);
     }
 
     av_free(new_url);