From 09e869a4c4424832a7bdc1933fad186d2536517a Mon Sep 17 00:00:00 2001 From: Loic Dachary Date: Wed, 19 Jun 2013 22:50:30 +0200 Subject: [PATCH] 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 --- src/osd/PGLog.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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()); -- 2.47.3