瀏覽代碼

Check the message to be encoded is the wrong type. (#4885) (#4949)

* Check the message to be encoded is the wrong type. (#4885)

* Change TypeError to ArgumentError
Paul Yang 7 年之前
父節點
當前提交
e508fc0c66
共有 2 個文件被更改,包括 17 次插入0 次删除
  1. 7 0
      ruby/ext/google/protobuf_c/encode_decode.c
  2. 10 0
      ruby/tests/encode_decode_test.rb

+ 7 - 0
ruby/ext/google/protobuf_c/encode_decode.c

@@ -1106,6 +1106,13 @@ static void putmsg(VALUE msg_rb, const Descriptor* desc,
 
 
   TypedData_Get_Struct(msg_rb, MessageHeader, &Message_type, msg);
   TypedData_Get_Struct(msg_rb, MessageHeader, &Message_type, msg);
 
 
+  if (desc != msg->descriptor) {
+    rb_raise(rb_eArgError,
+             "The type of given msg is '%s', expect '%s'.",
+             upb_msgdef_fullname(msg->descriptor->msgdef),
+             upb_msgdef_fullname(desc->msgdef));
+  }
+
   for (upb_msg_field_begin(&i, desc->msgdef);
   for (upb_msg_field_begin(&i, desc->msgdef);
        !upb_msg_field_done(&i);
        !upb_msg_field_done(&i);
        upb_msg_field_next(&i)) {
        upb_msg_field_next(&i)) {

+ 10 - 0
ruby/tests/encode_decode_test.rb

@@ -84,4 +84,14 @@ class EncodeDecodeTest < Test::Unit::TestCase
 
 
     assert_match 'optional_int32', json
     assert_match 'optional_int32', json
   end
   end
+
+  def test_encode_wrong_msg
+    e = assert_raise ::ArgumentError do
+      m = A::B::C::TestMessage.new(
+          :optional_int32 => 1,
+      )
+      Google::Protobuf::Any.encode(m)
+    end
+  end
+
 end
 end