From: John Spray Date: Tue, 20 Dec 2016 18:04:47 +0000 (+0000) Subject: mds: check for errors decoding backtraces X-Git-Tag: v12.0.0~254^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=6f489c74ac0040631fde0ceb0926cbab24d3ad55;p=ceph-ci.git mds: check for errors decoding backtraces Fixes: http://tracker.ceph.com/issues/18311 Signed-off-by: John Spray --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 919d6331089..c8a9ae2c8c7 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -8319,7 +8319,14 @@ void MDCache::_open_ino_backtrace_fetched(inodeno_t ino, bufferlist& bl, int err inode_backtrace_t backtrace; if (err == 0) { - ::decode(backtrace, bl); + try { + ::decode(backtrace, bl); + } catch (const buffer::error &decode_exc) { + derr << "corrupt backtrace on ino x0" << std::hex << ino + << std::dec << ": " << decode_exc << dendl; + open_ino_finish(ino, info, -EIO); + return; + } if (backtrace.pool != info.pool && backtrace.pool != -1) { dout(10) << " old object in pool " << info.pool << ", retrying pool " << backtrace.pool << dendl;