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>
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());