]> git.sesse.net Git - vlc/commitdiff
httplive: leaks on playlist reload/merge (fix #14171)
authorFrancois Cartegnie <fcvlcdev@free.fr>
Wed, 18 Mar 2015 11:56:15 +0000 (12:56 +0100)
committerFrancois Cartegnie <fcvlcdev@free.fr>
Wed, 18 Mar 2015 12:03:04 +0000 (13:03 +0100)
modules/stream_filter/httplive.c

index fa4201b4968a97fc29b8832ca4ecd679f4b36b38..24b44c44e5136e4c25cf132ee19a47cc8d275013 100644 (file)
@@ -1387,10 +1387,7 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
     {
         segment_t *p = segment_GetSegment(hls_new, n);
         if (p == NULL)
-        {
-            vlc_mutex_unlock(&hls_old->lock);
-            return VLC_EGENERIC;
-        }
+            continue;
 
         segment_t *segment = segment_Find(hls_old, p->sequence);
         if (segment)
@@ -1432,8 +1429,8 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
                 }
                 free(segment->psz_key_path);
                 segment->psz_key_path = p->psz_key_path ? strdup(p->psz_key_path) : NULL;
-                segment_Free(p);
             }
+            segment_Free(p);
             vlc_mutex_unlock(&segment->lock);
         }
         else
@@ -1442,7 +1439,8 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
             segment_t *l = segment_GetSegment(hls_old, last);
             if (l == NULL) {
                 vlc_mutex_unlock(&hls_old->lock);
-                return VLC_EGENERIC;
+                segment_Free(p);
+                continue;
             }
 
             if ((l->sequence + 1) != p->sequence)
@@ -1465,8 +1463,9 @@ static int hls_UpdatePlaylist(stream_t *s, hls_stream_t *hls_new, hls_stream_t *
     hls_old->duration = (hls_new->duration == -1) ? hls_old->duration : hls_new->duration;
     hls_old->b_cache = hls_new->b_cache;
     vlc_mutex_unlock(&hls_old->lock);
-    return VLC_SUCCESS;
 
+    vlc_array_clear(hls_new->segments);
+    return VLC_SUCCESS;
 }
 
 static int hls_ReloadPlaylist(stream_t *s)
@@ -1514,10 +1513,12 @@ static int hls_ReloadPlaylist(stream_t *s)
 
             // New segment available -  signal download thread
             stream_appended = true;
+            continue;
         }
         else if (hls_UpdatePlaylist(s, hls_new, hls_old, &stream_appended) != VLC_SUCCESS)
             msg_Warn(s, "failed updating HLS stream (id=%d, bandwidth=%"PRIu64")",
                      hls_new->id, hls_new->bandwidth);
+        hls_Free(hls_new);
     }
     vlc_array_destroy(hls_streams);