]> git.apps.os.sepia.ceph.com Git - ceph-ci.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)
committerJohn Spray <john.spray@redhat.com>
Thu, 5 Jan 2017 13:41:59 +0000 (13:41 +0000)
Fixes: http://tracker.ceph.com/issues/18311
Signed-off-by: John Spray <john.spray@redhat.com>
src/mds/MDCache.cc

index 919d6331089775728c635e7b0bb8c464ce13d630..c8a9ae2c8c70cc7c1395ca3d705b2f19708cd0db 100644 (file)
@@ -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;