From: John Spray Date: Thu, 24 Sep 2015 12:08:43 +0000 (+0100) Subject: tools/cephfs: detect malformed ESubtreeMap::expire_pos X-Git-Tag: v9.1.0~58^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=557df13b324bb396167772af6c9dd31136d7f895;p=ceph.git tools/cephfs: detect malformed ESubtreeMap::expire_pos Signed-off-by: John Spray --- diff --git a/src/tools/cephfs/JournalScanner.cc b/src/tools/cephfs/JournalScanner.cc index f75edd9b29f..f2d22d0c230 100644 --- a/src/tools/cephfs/JournalScanner.cc +++ b/src/tools/cephfs/JournalScanner.cc @@ -15,6 +15,8 @@ #include "include/rados/librados.hpp" #include "mds/JournalPointer.h" +#include "mds/events/ESubtreeMap.h" + #include "JournalScanner.h" #define dout_subsys ceph_subsys_mds @@ -256,9 +258,21 @@ int JournalScanner::scan_events() } LogEvent *le = LogEvent::decode(le_bl); + if (le) { dout(10) << "Valid entry at 0x" << std::hex << read_offset << std::dec << dendl; + if (le->get_type() == EVENT_SUBTREEMAP + || le->get_type() == EVENT_SUBTREEMAP_TEST) { + ESubtreeMap *sle = dynamic_cast(le); + if (sle->expire_pos > read_offset) { + errors.insert(std::make_pair( + read_offset, EventError( + -ERANGE, + "ESubtreeMap has expire_pos ahead of its own position"))); + } + } + if (filter.apply(read_offset, *le)) { events[read_offset] = EventRecord(le, consumed); } else {