]> 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>
Wed, 11 Jul 2012 01:21:06 +0000 (18:21 -0700)
Backport: argonaut
Signed-off-by: Sage Weil <sage@inktank.com>
src/osd/ReplicatedPG.cc

index d3348de9c7cacdf5002732dd962c2570bd7a8d03..4144cb947959d6f9c77648a6fb0be35342f8e770 100644 (file)
@@ -1783,11 +1783,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);
@@ -1810,6 +1818,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;