summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLoic Dachary <loic@dachary.org>2013-06-19 22:50:30 +0200
committerLoic Dachary <loic@dachary.org>2013-06-19 22:50:30 +0200
commit09e869a4c4424832a7bdc1933fad186d2536517a (patch)
tree1483a55f75a2752b358e3955a7ea57ec7666ff43
parent02b3c552659299c7c7c2e789f0660f0add2f639f (diff)
downloadceph-09e869a4c4424832a7bdc1933fad186d2536517a.tar.gz
PGLog::rewind_divergent_log must not call mark_dirty_from on end()
PGLog::rewind_divergent_log is dereferencing iterator "p" though it is already past the end of its container. When entering the loop for the first time, p is log.log.end() and must not be dereferenced. mark_dirty_from must only be called after p--. It will not rewind past begin() because of the if (p == log.log.begin()) test above. http://tracker.ceph.com/issues/5398 fixes #5398 Signed-off-by: Loic Dachary <loic@dachary.org>
-rw-r--r--src/osd/PGLog.cc2
1 files changed, 1 insertions, 1 deletions
diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc
index d62991e06d6..785bdc584ad 100644
--- a/src/osd/PGLog.cc
+++ b/src/osd/PGLog.cc
@@ -366,8 +366,8 @@ void PGLog::rewind_divergent_log(ObjectStore::Transaction& t, eversion_t newhead
divergent.swap(log.log);
break;
}
- mark_dirty_from(p->version);
--p;
+ mark_dirty_from(p->version);
if (p->version == newhead) {
++p;
divergent.splice(divergent.begin(), log.log, p, log.log.end());