Author: sapient
Date: Mon Sep  1 12:19:50 2008
New Revision: 29159

URL: http://svn.gna.org/viewcvs/wesnoth?rev=29159&view=rev
Log:
prevent a potential crash in unit_map::clean_invalid

Modified:
    trunk/src/unit_map.cpp

Modified: trunk/src/unit_map.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/unit_map.cpp?rev=29159&r1=29158&r2=29159&view=diff
==============================================================================
--- trunk/src/unit_map.cpp (original)
+++ trunk/src/unit_map.cpp Mon Sep  1 12:19:50 2008
@@ -28,10 +28,10 @@
 
 typedef std::pair<std::string, std::pair<bool, std::pair<gamemap::location, 
unit>*> > umap_pair;
 
-unit_map::unit_map(const gamemap::location &loc, const unit &u) : 
+unit_map::unit_map(const gamemap::location &loc, const unit &u) :
        map_(),
        lmap_(),
-       num_iters_(0), 
+       num_iters_(0),
        num_invalid_(0)
 {
        add(new std::pair<gamemap::location,unit>(loc, u));
@@ -41,7 +41,7 @@
        /* Initialize to silence compiler warnings. */
        map_(),
        lmap_(),
-       num_iters_(0), 
+       num_iters_(0),
        num_invalid_(0)
 {
        *this = that;
@@ -154,9 +154,9 @@
        return const_unit_iterator(iter, map_);
 }
 
-unit_map::unit_xy_iterator::unit_xy_iterator(const unit_iterator &i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
+unit_map::unit_xy_iterator::unit_xy_iterator(const unit_iterator &i) :
+       counter_(i.map_),
+       i_(i.i_),
        map_(i.map_),
        loc_(i.valid() ? i->first : gamemap::location())
 {
@@ -213,17 +213,17 @@
        return i_ != map_->map_.end() && i_->second.first && loc_ == 
i_->second.second->first;
 }
 
-unit_map::const_unit_xy_iterator::const_unit_xy_iterator(const unit_iterator 
&i) : 
-       counter_(i.map_), 
-       i_(i.i_),
-       map_(i.map_),
-       loc_(i.valid() ? i->first : gamemap::location())
-{
-}
-
-unit_map::const_unit_xy_iterator::const_unit_xy_iterator(const 
const_unit_iterator &i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
+unit_map::const_unit_xy_iterator::const_unit_xy_iterator(const unit_iterator 
&i) :
+       counter_(i.map_),
+       i_(i.i_),
+       map_(i.map_),
+       loc_(i.valid() ? i->first : gamemap::location())
+{
+}
+
+unit_map::const_unit_xy_iterator::const_unit_xy_iterator(const 
const_unit_iterator &i) :
+       counter_(i.map_),
+       i_(i.i_),
        map_(i.map_),
        loc_(i.valid() ? i->first : gamemap::location())
 {
@@ -279,17 +279,17 @@
 }
 
 
-unit_map::xy_accessor::xy_accessor(const unit_iterator &i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
-       map_(i.map_),
-       loc_(i.valid() ? i->first : gamemap::location())
-{
-}
-
-unit_map::xy_accessor::xy_accessor(const unit_xy_iterator &i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
+unit_map::xy_accessor::xy_accessor(const unit_iterator &i) :
+       counter_(i.map_),
+       i_(i.i_),
+       map_(i.map_),
+       loc_(i.valid() ? i->first : gamemap::location())
+{
+}
+
+unit_map::xy_accessor::xy_accessor(const unit_xy_iterator &i) :
+       counter_(i.map_),
+       i_(i.i_),
        map_(i.map_),
        loc_(i.valid() ? i->first : gamemap::location())
 {
@@ -323,33 +323,33 @@
        return false;
 }
 
-unit_map::const_xy_accessor::const_xy_accessor(const const_unit_iterator &i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
-       map_(i.map_),
-       loc_(i.valid() ? i->first : gamemap::location())
-{
-}
-
-unit_map::const_xy_accessor::const_xy_accessor(const unit_iterator &i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
-       map_(i.map_),
-       loc_(i.valid() ? i->first : gamemap::location())
-{
-}
-
-unit_map::const_xy_accessor::const_xy_accessor(const const_unit_xy_iterator 
&i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
-       map_(i.map_),
-       loc_(i.valid() ? i->first : gamemap::location())
-{
-}
-
-unit_map::const_xy_accessor::const_xy_accessor(const unit_xy_iterator &i) : 
-       counter_(i.map_), 
-       i_(i.i_), 
+unit_map::const_xy_accessor::const_xy_accessor(const const_unit_iterator &i) :
+       counter_(i.map_),
+       i_(i.i_),
+       map_(i.map_),
+       loc_(i.valid() ? i->first : gamemap::location())
+{
+}
+
+unit_map::const_xy_accessor::const_xy_accessor(const unit_iterator &i) :
+       counter_(i.map_),
+       i_(i.i_),
+       map_(i.map_),
+       loc_(i.valid() ? i->first : gamemap::location())
+{
+}
+
+unit_map::const_xy_accessor::const_xy_accessor(const const_unit_xy_iterator 
&i) :
+       counter_(i.map_),
+       i_(i.i_),
+       map_(i.map_),
+       loc_(i.valid() ? i->first : gamemap::location())
+{
+}
+
+unit_map::const_xy_accessor::const_xy_accessor(const unit_xy_iterator &i) :
+       counter_(i.map_),
+       i_(i.i_),
        map_(i.map_),
        loc_(i.valid() ? i->first : gamemap::location())
 {
@@ -535,11 +535,13 @@
 void unit_map::clean_invalid() {
        size_t num_cleaned = 0;
 
-       umap::iterator iter;
-       for (iter = map_.begin(); iter != map_.end(); ++iter) {
+       umap::iterator iter = map_.begin();
+       while (iter != map_.end()) {
                if (!iter->second.first) {
-                       map_.erase(iter--);
-                       num_cleaned++;
+                       map_.erase(iter++);
+                       ++num_cleaned;
+               } else {
+                       ++iter;
                }
        }
 


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to