]> git.ipfire.org Git - thirdparty/tvheadend.git/commitdiff
Fix ordering problem with function calls that can result in use of freed memory.
authorAdam Sutton <dev@adamsutton.me.uk>
Thu, 5 Jul 2012 21:50:27 +0000 (22:50 +0100)
committerAdam Sutton <dev@adamsutton.me.uk>
Mon, 30 Jul 2012 14:52:15 +0000 (15:52 +0100)
src/epg.c

index 2cf7d2dd291ea8a2d6902d509ed0912fc6d8f896..10ce1a7ece51eba3def853dc6f18ed733e11cac4 100644 (file)
--- a/src/epg.c
+++ b/src/epg.c
@@ -343,33 +343,33 @@ int epg_brand_set_season_count ( epg_brand_t *brand, uint16_t count )
 static void _epg_brand_add_season 
   ( epg_brand_t *brand, epg_season_t *season )
 {
-  LIST_INSERT_SORTED(&brand->seasons, season, blink, _season_order);
   _epg_object_getref(brand);
   _epg_object_set_updated(brand);
+  LIST_INSERT_SORTED(&brand->seasons, season, blink, _season_order);
 }
 
 static void _epg_brand_rem_season
   ( epg_brand_t *brand, epg_season_t *season )
 {
   LIST_REMOVE(season, blink);
-  _epg_object_putref(brand);
   _epg_object_set_updated(brand);
+  _epg_object_putref(brand);
 }
 
 static void _epg_brand_add_episode
   ( epg_brand_t *brand, epg_episode_t *episode )
 {
-  LIST_INSERT_SORTED(&brand->episodes, episode, blink, _episode_order);
   _epg_object_getref(brand);
   _epg_object_set_updated(brand);
+  LIST_INSERT_SORTED(&brand->episodes, episode, blink, _episode_order);
 }
 
 static void _epg_brand_rem_episode
   ( epg_brand_t *brand, epg_episode_t *episode )
 {
   LIST_REMOVE(episode, blink);
-  _epg_object_putref(brand);
   _epg_object_set_updated(brand);
+  _epg_object_putref(brand);
 }
 
 htsmsg_t *epg_brand_serialize ( epg_brand_t *brand )
@@ -509,17 +509,17 @@ int epg_season_set_brand ( epg_season_t *season, epg_brand_t *brand, int u )
 static void _epg_season_add_episode
   ( epg_season_t *season, epg_episode_t *episode )
 {
-  LIST_INSERT_SORTED(&season->episodes, episode, slink, _episode_order);
   _epg_object_getref(season);
   _epg_object_set_updated(season);
+  LIST_INSERT_SORTED(&season->episodes, episode, slink, _episode_order);
 }
 
 static void _epg_season_rem_episode
   ( epg_season_t *season, epg_episode_t *episode )
 {
   LIST_REMOVE(episode, slink);
-  _epg_object_putref(season);
   _epg_object_set_updated(season);
+  _epg_object_putref(season);
 }
 
 htsmsg_t *epg_season_serialize ( epg_season_t *season )
@@ -813,17 +813,17 @@ int epg_episode_set_is_bw ( epg_episode_t *e, uint8_t bw )
 static void _epg_episode_add_broadcast 
   ( epg_episode_t *episode, epg_broadcast_t *broadcast )
 {
-  LIST_INSERT_SORTED(&episode->broadcasts, broadcast, ep_link, _ebc_start_cmp);
   _epg_object_getref(episode);
   _epg_object_set_updated(episode);
+  LIST_INSERT_SORTED(&episode->broadcasts, broadcast, ep_link, _ebc_start_cmp);
 }
 
 static void _epg_episode_rem_broadcast
   ( epg_episode_t *episode, epg_broadcast_t *broadcast )
 {
   LIST_REMOVE(broadcast, ep_link);
-  _epg_object_putref(episode);
   _epg_object_set_updated(episode);
+  _epg_object_putref(episode);
 }
 
 size_t epg_episode_number_format 
@@ -1045,6 +1045,7 @@ static epg_broadcast_t *_epg_channel_add_broadcast
       ret    = *bcast;
       *bcast = NULL;
       _epg_object_create(ret);
+      // Note: sets updated
       _epg_object_getref(ret);
 
     /* No change */
@@ -1054,6 +1055,7 @@ static epg_broadcast_t *_epg_channel_add_broadcast
     /* Extend in time */
     } else {
       ret->stop = (*bcast)->stop;
+      _epg_object_set_updated(ret);
     }
   }