From: John Spray Date: Tue, 20 Dec 2016 18:04:47 +0000 (+0000) Subject: mds: check for errors decoding backtraces X-Git-Tag: v11.2.1~234^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dbedbab057bf205045c6746d3e717f1dd4e93ea2;p=ceph.git mds: check for errors decoding backtraces Fixes: http://tracker.ceph.com/issues/18311 Signed-off-by: John Spray (cherry picked from commit 6f489c74ac0040631fde0ceb0926cbab24d3ad55) --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 2d6e412b29f..9cff6e9c544 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -8318,7 +8318,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;