summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Milkie <milkie@10gen.com>2012-02-29 13:10:54 -0500
committerEliot Horowitz <eliot@10gen.com>2012-03-04 20:09:23 -0500
commitabb62840567ae8e342fcd07c845765f7fca9e7a8 (patch)
treee4bfc417364b0e124dfe72d707091ffc16962c2f
parentd13fb74970b28a3df5806f522790fb194724b0a7 (diff)
downloadmongo-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.cpp9
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;