diff options
author | Eric Milkie <milkie@10gen.com> | 2012-02-29 13:10:54 -0500 |
---|---|---|
committer | Eliot Horowitz <eliot@10gen.com> | 2012-03-04 20:09:23 -0500 |
commit | abb62840567ae8e342fcd07c845765f7fca9e7a8 (patch) | |
tree | e4bfc417364b0e124dfe72d707091ffc16962c2f | |
parent | d13fb74970b28a3df5806f522790fb194724b0a7 (diff) | |
download | mongo-abb62840567ae8e342fcd07c845765f7fca9e7a8.tar.gz |
SERVER-5081 do not delete iterator until after it's incremented
Avoids memory reads of freed memory.
-rw-r--r-- | db/repl/rs.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/db/repl/rs.cpp b/db/repl/rs.cpp index f827291c3f3..23abc24931d 100644 --- a/db/repl/rs.cpp +++ b/db/repl/rs.cpp @@ -100,17 +100,20 @@ namespace mongo { lock lk(this); Member *max = 0; - - for (set<unsigned>::iterator it = _electableSet.begin(); it != _electableSet.end(); it++) { + set<unsigned>::iterator it = _electableSet.begin(); + while ( it != _electableSet.end() ) { const Member *temp = findById(*it); if (!temp) { log() << "couldn't find member: " << *it << endl; - _electableSet.erase(*it); + set<unsigned>::iterator it_delete = it; + it++; + _electableSet.erase(it_delete); continue; } if (!max || max->config().priority < temp->config().priority) { max = (Member*)temp; } + it++; } return max; |