]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: guard class call decoding
authorSage Weil <sage@inktank.com>
Mon, 9 Jul 2012 20:22:42 +0000 (13:22 -0700)
committerSage Weil <sage@inktank.com>
Tue, 10 Jul 2012 21:03:06 +0000 (14:03 -0700)
Backport: argonaut
Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc

index 72a1a1a10bf0998bf6eba0fbadb0354af69142d7..54a2a785d85786d0c4a7d555048219658336fa39 100644 (file)
@@ -1808,11 +1808,19 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
     case CEPH_OSD_OP_CALL:
       {
        string cname, mname;
-       bp.copy(op.cls.class_len, cname);
-       bp.copy(op.cls.method_len, mname);
-
        bufferlist indata;
-       bp.copy(op.cls.indata_len, indata);
+       try {
+         bp.copy(op.cls.class_len, cname);
+         bp.copy(op.cls.method_len, mname);
+         bp.copy(op.cls.indata_len, indata);
+       } catch (buffer::error& e) {
+         dout(10) << "call unable to decode class + method + indata" << dendl;
+         dout(30) << "in dump: ";
+         osd_op.indata.hexdump(*_dout);
+         *_dout << dendl;
+         result = -EINVAL;
+         break;
+       }
 
        ClassHandler::ClassData *cls;
        result = osd->class_handler->open_class(cname, &cls);
@@ -1835,6 +1843,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& ops)
        dout(10) << "method called response length=" << outdata.length() << dendl;
        op.extent.length = outdata.length();
        osd_op.outdata.claim_append(outdata);
+       dout(30) << "out dump: ";
+       osd_op.outdata.hexdump(*_dout);
+       *_dout << dendl;
       }
       break;