From: Loic Dachary Date: Wed, 19 Jun 2013 20:50:30 +0000 (+0200) Subject: PGLog::rewind_divergent_log must not call mark_dirty_from on end() X-Git-Tag: v0.66~45^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=09e869a4c4424832a7bdc1933fad186d2536517a;p=ceph.git 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 --- diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index d62991e06d67..785bdc584ad5 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());