diff options
author | Loic Dachary <loic@dachary.org> | 2013-06-19 22:50:30 +0200 |
---|---|---|
committer | Loic Dachary <loic@dachary.org> | 2013-06-19 22:50:30 +0200 |
commit | 09e869a4c4424832a7bdc1933fad186d2536517a (patch) | |
tree | 1483a55f75a2752b358e3955a7ea57ec7666ff43 | |
parent | 02b3c552659299c7c7c2e789f0660f0add2f639f (diff) | |
download | ceph-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.cc | 2 |
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()); |