From: Patrick Donnelly Date: Tue, 12 Oct 2021 18:00:50 +0000 (-0400) Subject: mon/MDSMonitor: avoid crash when decoding old FSMap epochs X-Git-Tag: v17.1.0~627^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=631360a41ab2ad93445d35a9730200beef2bebab;p=ceph.git mon/MDSMonitor: avoid crash when decoding old FSMap epochs Fixes: https://tracker.ceph.com/issues/52820 Signed-off-by: Patrick Donnelly --- diff --git a/src/mds/FSMap.cc b/src/mds/FSMap.cc index d82f8c439cc5..9fe50244ef13 100644 --- a/src/mds/FSMap.cc +++ b/src/mds/FSMap.cc @@ -651,6 +651,7 @@ void FSMap::encode(bufferlist& bl, uint64_t features) const void FSMap::decode(bufferlist::const_iterator& p) { + struct_version = 0; DECODE_START(STRUCT_VERSION, p); DECODE_OLDEST(7); struct_version = struct_v; diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index c3a3d0046e4a..b64671176f5e 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -2335,7 +2335,12 @@ void MDSMonitor::tick() derr << "could not get version " << v << dendl; ceph_abort(); } - fsmap.decode(bl); + try { + fsmap.decode(bl); + } catch (const ceph::buffer::malformed_input& e) { + dout(5) << "flushing old fsmap struct because unable to decode FSMap: " << e.what() << dendl; + } + /* N.B. FSMap::is_struct_old is also true for undecoded (failed to decode) FSMap */ if (fsmap.is_struct_old()) { dout(5) << "fsmap struct is too old; proposing to flush out old versions" << dendl; do_propose = true;