]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: check for errors decoding backtraces
authorJohn Spray <john.spray@redhat.com>
Tue, 20 Dec 2016 18:04:47 +0000 (18:04 +0000)
committerNathan Cutler <ncutler@suse.com>
Mon, 9 Jan 2017 13:56:55 +0000 (14:56 +0100)
Fixes: http://tracker.ceph.com/issues/18311
Signed-off-by: John Spray <john.spray@redhat.com>
(cherry picked from commit 6f489c74ac0040631fde0ceb0926cbab24d3ad55)

src/mds/MDCache.cc

index 2d6e412b29f7923af1c94db2368ffd712cf503c3..9cff6e9c5444fe4a1778c44805450d5ed19c7af6 100644 (file)
@@ -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;