From: Yan, Zheng Date: Tue, 9 Oct 2018 03:46:56 +0000 (+0800) Subject: mds: handle bad purge queue item encoding X-Git-Tag: v13.2.3~74^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ba06fcbe3e8345dc2c4c4c3dc3bcc18acf5ab076;p=ceph.git mds: handle bad purge queue item encoding The bad encoding was introduced by commit a88f8d5eb4 Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/PurgeQueue.cc b/src/mds/PurgeQueue.cc index 8ca2ceaf712..5b9ca61cfed 100644 --- a/src/mds/PurgeQueue.cc +++ b/src/mds/PurgeQueue.cc @@ -56,15 +56,39 @@ void PurgeItem::encode(bufferlist &bl) const void PurgeItem::decode(bufferlist::iterator &p) { DECODE_START(2, p); - decode((uint8_t&)action, p); - decode(ino, p); - decode(size, p); - decode(layout, p); - decode(old_pools, p); - decode(snapc, p); - decode(fragtree, p); - if (struct_v >= 2) { - decode(stamp, p); + bool done = false; + if (struct_v == 1) { + auto p_start = p; + try { + // bad encoding introduced by v13.2.2 + decode(stamp, p); + decode(pad_size, p); + p.advance(pad_size); + decode((uint8_t&)action, p); + decode(ino, p); + decode(size, p); + decode(layout, p); + decode(old_pools, p); + decode(snapc, p); + decode(fragtree, p); + if (p.get_off() > struct_end) + throw buffer::end_of_buffer(); + done = true; + } catch (const buffer::error &e) { + p = p_start; + } + } + if (!done) { + decode((uint8_t&)action, p); + decode(ino, p); + decode(size, p); + decode(layout, p); + decode(old_pools, p); + decode(snapc, p); + decode(fragtree, p); + if (struct_v >= 2) { + decode(stamp, p); + } } DECODE_FINISH(p); }