From dbedbab057bf205045c6746d3e717f1dd4e93ea2 Mon Sep 17 00:00:00 2001 From: John Spray Date: Tue, 20 Dec 2016 18:04:47 +0000 Subject: [PATCH] mds: check for errors decoding backtraces Fixes: http://tracker.ceph.com/issues/18311 Signed-off-by: John Spray (cherry picked from commit 6f489c74ac0040631fde0ceb0926cbab24d3ad55) --- src/mds/MDCache.cc | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 2d6e412b29f79..9cff6e9c5444f 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; -- 2.39.5