]> err.no Git - libchamplain/commitdiff
Fix array usage in ChamplainZoomLevel
authorPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Sat, 13 Jun 2009 22:18:39 +0000 (18:18 -0400)
committerPierre-Luc Beaudoin <pierre-luc@pierlux.com>
Sat, 13 Jun 2009 22:18:39 +0000 (18:18 -0400)
Based on how the array was iterated, it wasn't rare that the requested
index would be well over the array's end.

champlain/champlain-view.c
champlain/champlain-zoom-level.c

index 795813661620fc95c317932873762e533671d1a0..84f3fb372c6c631f96bcf62a8ae2c01619e9217f 100644 (file)
@@ -1638,14 +1638,23 @@ view_load_visible_tiles (ChamplainView *view)
   DEBUG ("Range %d, %d to %d, %d", x_first, y_first, x_count, y_count);
 
   int i, j;
-  guint k;
+  guint k = 0;
 
   // Get rid of old tiles first
-  for (k = 0; k < champlain_zoom_level_tile_count (level); k++)
+  int count = champlain_zoom_level_tile_count (level);
+  while (k < count)
     {
       ChamplainTile *tile = champlain_zoom_level_get_nth_tile (level, k);
+
+      if (tile == NULL)
+        {
+          k++;
+          continue;
+        }
+
       gint tile_x = champlain_tile_get_x (tile);
       gint tile_y = champlain_tile_get_y (tile);
+
       if (tile_x < x_first || tile_x > x_count ||
           tile_y < y_first || tile_y > y_count)
       {
@@ -1657,7 +1666,10 @@ view_load_visible_tiles (ChamplainView *view)
             clutter_container_remove_actor (CLUTTER_CONTAINER (group), actor);
           }
         champlain_zoom_level_remove_tile (level, tile);
+        count = champlain_zoom_level_tile_count (level);
       }
+      else
+        k++;
     }
 
   //Load new tiles if needed
@@ -1669,6 +1681,10 @@ view_load_visible_tiles (ChamplainView *view)
           for (k = 0; k < champlain_zoom_level_tile_count (level) && !exist; k++)
             {
               ChamplainTile *tile = champlain_zoom_level_get_nth_tile (level, k);
+
+              if (tile == NULL)
+                continue;
+
               gint tile_x = champlain_tile_get_x (tile);
               gint tile_y = champlain_tile_get_y (tile);
 
@@ -1726,6 +1742,10 @@ view_tiles_reposition (ChamplainView* view)
   for (i = 0; i < champlain_zoom_level_tile_count (priv->map->current_level); i++)
     {
       ChamplainTile *tile = champlain_zoom_level_get_nth_tile (priv->map->current_level, i);
+
+      if (tile == NULL)
+        continue;
+
       if (champlain_tile_get_state (tile) == CHAMPLAIN_STATE_DONE)
         view_position_tile (view, tile);
     }
@@ -1750,6 +1770,10 @@ view_update_state (ChamplainView *view)
   for (i = 0; i < champlain_zoom_level_tile_count (priv->map->current_level); i++)
     {
       ChamplainTile *tile = champlain_zoom_level_get_nth_tile (priv->map->current_level, i);
+
+      if (tile == NULL)
+        continue;
+
       if (champlain_tile_get_state (tile) == CHAMPLAIN_STATE_LOADING)
         new_state = CHAMPLAIN_STATE_LOADING;
     }
index 155e323b6eac9525440d519a413e0530fe456496..665487907f383dbd32509dcb1545fd304ed54c72 100644 (file)
@@ -108,7 +108,6 @@ champlain_zoom_level_set_property (GObject *object,
 static void
 champlain_zoom_level_dispose (GObject *object)
 {
-  //FIXME: Get rid of tiles here?
   guint k;
   ChamplainZoomLevel *level = CHAMPLAIN_ZOOM_LEVEL (object);
   ChamplainZoomLevelPrivate *priv = level->priv;
@@ -124,8 +123,9 @@ champlain_zoom_level_dispose (GObject *object)
       int count = champlain_zoom_level_tile_count (level);
       for (k = 0; k < count; k++)
         {
-          ChamplainTile *tile = champlain_zoom_level_get_nth_tile (level, k);
-          champlain_zoom_level_remove_tile (level, tile);
+          ChamplainTile *tile = champlain_zoom_level_get_nth_tile (level, 0);
+          if (tile != NULL)
+              champlain_zoom_level_remove_tile (level, tile);
         }
       g_ptr_array_free (priv->tiles, TRUE);
       priv->tiles = NULL;
@@ -260,6 +260,8 @@ champlain_zoom_level_get_nth_tile (ChamplainZoomLevel *self,
   g_return_val_if_fail (CHAMPLAIN_ZOOM_LEVEL (self), NULL);
 
   ChamplainZoomLevelPrivate *priv = self->priv;
+  g_return_val_if_fail (index < priv->tiles->len, NULL);
+  g_return_val_if_fail (index >= 0, NULL);
 
   return g_ptr_array_index (priv->tiles, index);
 }