cosmos / cosmos-sdk

:chains: A Framework for Building High Value Public Blockchains :sparkles:
https://cosmos.network/
Apache License 2.0
6.24k stars 3.61k forks source link

[fuzz] codec: ProtoCodec.UnmarshalBinaryLengthPrefixed returns "proto: integer overflow" for a struct that was properly MarshalBinaryLengthPrefixed'd before #6850

Closed odeke-em closed 4 years ago

odeke-em commented 4 years ago

Summary of Bug

Coming here from fuzzing ProtoCodec, I generated a serialized version of a struct that was successfully produced by ProtoCodec.MarshalBinaryLengthPrefixed Given this program

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "os"

    "github.com/cosmos/cosmos-sdk/codec"
    "github.com/cosmos/cosmos-sdk/codec/types"
    "github.com/cosmos/cosmos-sdk/testutil/testdata"
)

var cdc = codec.NewProtoCodec(types.NewInterfaceRegistry())

func main() {
    data, err := ioutil.ReadFile(os.Args[1])
    if err != nil {
        panic(err)
    }
    t3ln := new(testdata.TestVersion3LoneNesting)
    if err := cdc.UnmarshalBinaryLengthPrefixed(data, t3ln); err != nil {
        panic(err)
    }

    rtBytes, err := cdc.MarshalBinaryLengthPrefixed(t3ln)
    if err != nil {
        panic(fmt.Sprintf("roundtrip marshal failed: %v", err))
    }

    if !bytes.Equal(data, rtBytes) {
        blob, _ := json.Marshal(t3ln)
        panic(fmt.Sprintf("roundtrip bytes did not match\nGot:  % x\nWant: % x\n\n\n%s", rtBytes, data, blob))
    }
}

where proto definitions in testutil/testdata/proto.proto are

message TestVersion3 {
    int64 x = 1;
    TestVersion3 a = 2;
    TestVersion3 b = 3; // [(gogoproto.nullable) = false];
    repeated TestVersion3 c = 4;
    repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false];
    oneof sum {
        int32 e = 6;
        TestVersion3 f = 7;
    }
    google.protobuf.Any g = 8;
    repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"];
    // google.protobuf.Timestamp i = 10;
    // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true];
    Customer1 k = 12 [(gogoproto.embed) = true];
    string non_critical_field = 1031;
}

message TestVersion3LoneNesting {
    int64 x = 1;
    TestVersion3 a = 2;
    TestVersion3 b = 3; // [(gogoproto.nullable) = false];
    repeated TestVersion3 c = 4;
    repeated TestVersion3 d = 5; // [(gogoproto.nullable) = false];
    oneof sum {
        TestVersion3LoneNesting f = 7;
    }
    google.protobuf.Any g = 8;
    repeated TestVersion1 h = 9; //[(gogoproto.castrepeated) = "TestVersion1"];
    // google.protobuf.Timestamp i = 10;
    // google.protobuf.Timestamp j = 11; // [(gogoproto.stdtime) = true];
    Customer1 k = 12 [(gogoproto.embed) = true];
    string non_critical_field = 1031;

    message Inner1 {
        int64 id = 1;
        string name = 2;
        message InnerInner {
            string id = 1;
            string city = 2;
        }
        InnerInner inner = 3;
    }

    Inner1 inner1 = 14;

    message Inner2 {
        string id = 1;
        string country = 2;
        message InnerInner {
            string id = 1;
            string city = 2;
        }
        InnerInner inner = 3;
    }

    Inner2 inner2 = 15;
}

Running this program produces

$ go run dt.go proto_codec/crashers/576acbaef7061cb874c6fc3d67b8cb38ad8dff34
panic: proto: integer overflow

goroutine 1 [running]:
main.main()
    /Users/emmanuelodeke/go/src/github.com/cosmos/cosmos-sdk/fuzz/codec/dt.go:24 +0x3ed
exit status 2

and this input

```go strBlob := "\xf7`\b\xc1\xf9\xd4\xfd\xf9\xff\xbf\xaf\xcd\x01\x12\x9c[\b\xd4\xc0\xfb" + "\xab\x9c\xad\xd6\xf2\xa4\x01\x12\x99<\b\x95\xc7\xe5\xd4\xe0\xff\x88\xbb3" + "\x12\x00\x1a\x00*\xce\x06\b\xe8\xb3\xe2\x98\xea\xc5\xc3\xfa\xb5\x01\x12\x00" + "\x1a\x00B\x8b\x06\n\x16/testdata.Tes" + "tVersion3\x12\xf0\x05\bѴ\xc2\xf5\x87\xf8\xe0" + "Յ\x01\x12\x00\x1a\x00B\x83\x05\n\x16/testdat" + "a.TestVersion3\x12\xe8\x04\b\xce\xc7" + "\x96テ\xbeћ\x01\x12\x00\x1a\x00B\x90\x04\n\x16/te" + "stdata.TestVersion3\x12" + "\xf5\x03\b\xa2\xbe\xbc\xb0\x8e\x9e\xc1\xb7\x16\x12\xbc\x02\bӧ\xf7\x8b" + "\x8c\x9e\xb8\xf7\xfb\x01\x12\x00\x1a\x00B\xf4\x01\n\x16/test" + "data.TestVersion3\x12\xd9\x01" + "\b\xa0ʃ\xf4\xae\xf2ֹ\x12\x12\x00\x1a\x00B\x88\x01\n\x16/" + "testdata.TestVersion" + "3\x12n\b\xe1ӆ\xe8\xe4\xd5\xf8\xed=\x12\x00\x1a\x00B\x1c\n" + "\x16/testdata.TestVersi" + "on2\x12\x02\b\x14b@\b\x8f\xeb\xe7\x92\x02\x12\x0epl\xe6" + "\xa4\xac条憵腋\x1d_r)?:#Č" + "峼秾`侷'椊L鳕£" + "\xe6\x00\x00\x10\x00\xb0衎ěĕb>\b\x8f\xa8\xff\f" + "\x12\x18展Ʃ卩齼蠔嘨\xe6" + "\x8a\x89便8\x1d\xc5\xce\xf3>:\x18ȜĿ箤" + "軟HUư鐷Dzǂ獿b4\b" + "꾭\xaf\xfe\xff\xff\xff\xff\x01\x12\x15耸尽Š" + "粄盿`G丯V0\x1d\xbc\xc6\x1d?:\v" + "ſ@Ȭ峀荒\x1a\x00Bv\n\x16/te" + "stdata.TestVersion3\x12" + "\\\b\xcbߢ\xc5\xe4\xf0\xe9\xd8\f\x12\x00\x1a\x00B\x1c\n\x16/" + "testdata.TestVersion" + "2\x12\x02\b\x14b.\b\x9f\x93і\x03\x12\x1bŴy\xe9\x83" + "\xb6謿俟ó.惇)鑄襳" + "ɦ\x1d\x83\x91[?:\x04\\瘋b0\b\xb6\xfa\xae\x90" + "\xfe\xff\xff\xff\xff\x01\x12\x0e*ǯ>9ȬĩNj\xe5" + "\xb7\xb1\x1d,$$>:\x0e露払銵e\xc9" + "\x82$1bD\bϗɻ\x04\x12%Ƨ燋Ü" + "{骣锉Ī濼ü甬吟" + "谭;t性Ǐ\x1dS\xb9,>:\x10Ø\xe5" + "\x8e\x93Ov氷僋DóbY\b\xf8\xd9\xef\xa8" + "\xf9\xff\xff\xff\xff\x01\x12\x1el僒k子Ɨi\xe9" + "\x9f\x8c@ 贁Ǟǘ蜾y变\x1d\x14" + "f\x1e?:'炣NJɂ_秴芽\xca" + "\xa4XZ嘏兮 Ȭ憦灄\xe5\x87" + "\x85裳b/\bȸ\xc0\xa7\xfd\xff\xff\xff\xff\x01\x1d\xac\xf8" + "5?:\x1dĬÌʨc<ɫyƼ絚" + "ɿ姯躶VknƖ*\x84\x01\b\x9e\xf1\xd2" + "Ճ\x87\xad\xfb\a\x12\x00\x1a\x00B\x1c\n\x16/testd" + "ata.TestVersion1\x12\x02\b\n" + "bV\bꞳ\xef\xfe\xff\xff\xff\xff\x01\x12#廠Ÿ" + "Ǯ郫Ⱦ惫õ9ǐ婱\xe9\xa3" + "\x93ǫǭ哿Ǭ\x1dpm8?:\x1f絶" + "ɷ¾i-彳RÝÄ俥ƍ%" + "uljƉ脉*|\b\x90\xd6ґ\xe6\xfe\xc1\x8d\xb7" + "\x01\x12\x00\x1a\x00B\x1c\n\x16/testdata.T" + "estVersion2\x12\x02\b\x14bM\b\x90\xa2" + "\xfd\xde\xfa\xff\xff\xff\xff\x01\x12\x1a杰籨R_\xe8\xb7" + "\xaa箦[0魔ɯ^ÕC?\x1d\xc7\u0094" + ">:\x1fQdďĆIʛƿhǺǀ\xca" + "\x9dǐʋEğNȬ褅*}\b\xad\x85\x9c" + "\xd3ɽ\xad\xad\x1e\x12\x00\x1a\x00B\x1c\n\x16/testd" + "ata.TestVersion1\x12\x02\b\n" + "bO\b\xc2\xe1\x9f\xe5\xfa\xff\xff\xff\xff\x01\x12\x10·埊" + "埦濋ț賵\x1d\x1f\x0eK?:+\xe5\xba" + "\x98ɳ尤 ȴ漒厝險\xe9\x94" + "\x8e 彺wɒȺƔɌx扲\xe9\x9a" + "\xb3*M\b\x82\xa8\xc1\xa6\xf3\x80\xec\xcc:\x12\x00\x1a\x00B\x1c\n" + "\x16/testdata.TestVersi" + "on1\x12\x02\b\nb\x1f\b\xb9\x89\xa4\xed\x05\x12\tbDz" + "Ș¬gw\x1d>\xa1|?:\a膠蝦{" + "J\xa1+\b\xb1\xc7\xfa\xc1\x9b֑\xc6C\x12\x00\x1a\x00\"a\b" + "²\xfc\x93\xc3\xc1\xf3\xb3\xca\x01\x12\x00\x1a\x00B\x1c\n\x16/t" + "estdata.TestVersion1" + "\x12\x02\b\nb2\b\xba\xe3ז\xfb\xff\xff\xff\xff\x01\x12\x18\xc4" + "\xb9@ō#扲lFæĊ护ŋ\xc5" + "\xae×\x1d\x1axd?:\x06肰辜\"i\b\xef" + "\xeb\xb0\xe8Ӛ\xb0\xe4O\x12\x00\x1a\x00B\x1c\n\x16/tes" + "tdata.TestVersion2\x12\x02" + "\b\x14b;\b\xa5\x80\xfe\xca\x06\x12\x05*ȬɊ\x1d#\xac" + "\xa4>:'沛x鴅Ů熧雂l" + ";ĽF灸獃产ɏ戦+*" + "iȫ\"\xee\x05\bМհ\xc3\xcc\xcf\xea\xd8\x01\x12\x00\x1a" + "\x00\"\xc2\x01\b\x88\xe3\xfc\xe8\xb8\xf2\xa2ݠ\x01\x12\x00\x1a\x00B" + "z\n\x16/testdata.TestVer" + "sion3\x12`\b\x84\xf0\xbe\xecɉ\x82\b\x12\x00\x1a\x00" + "B\x1c\n\x16/testdata.TestVe" + "rsion2\x12\x02\b\x14b3\b\xf1\xf9\x97\x8d\x05\x12\a" + "Ǧő澑\x1dn\x8b\xd0=:\x1dDŽ怔X" + "唁-稪ņ>o{ō0ȓ+¦" + "Ô2b5\b\x88\xe9\xc0\x98\x05\x12\x1dê¨Ƶ\xe7" + "\xb7\xb9nt×胧ph淁确拘" + ":\t7ȨƓK憰\"\xb2" + "\x01\b\xbe\xbb\x97栋\x80\xc6T\x12\x00\x1a\x00Bo\n\x16/" + "testdata.TestVersion" + "3\x12U\b\x9a\x86\x82\xf4\xa5\x84\xbe\xdfk\x12\x00\x1a\x00B\x1c\n" + "\x16/testdata.TestVersi" + "on2\x12\x02\b\x14b'\b̼\xd9\xd5\xff\xff\xff\xff\xff\x01" + "\x12\f胷梆燲FŅ\x1dw.\xb3>:" + "\a馚迻1b1\b\x95\xfb\x9d\xac\xfd\xff\xff\xff\xff" + "\x01\x12\x01D\x1d\xf4X;?:\x1cQɇʡ僗\xe7" + "\x9c\xa7嗮kAɅ旧僋ƀƆ\"" + "\xa7\x01\b\xe0\u0df5\xa8\xbbƱ6\x12\x00\x1a\x00Bu\n\x16" + "/testdata.TestVersio" + "n3\x12[\b㉆\xf3ȫ\xbf\xafe\x12\x00\x1a\x00B\x1c" + "\n\x16/testdata.TestVers" + "ion1\x12\x02\b\nb-\b\xac\xbdԛ\xf9\xff\xff\xff\xff" + "\x01\x1d\xb28v<:\x1bĮD寙車爆" + "巬:EɗĚ!TƜǝb \b\xe3\x9b" + "\xd6\xe6\xfe\xff\xff\xff\xff\x01\x12\n»徊ǣ駜" + "\x1dm\x89\xdc=:\x02 h\"p\b\xf1\xe2\xcd\xf2\x97ʽ\xdd" + "*\x12\x00\x1a\x00B\x1c\n\x16/testdata.T" + "estVersion2\x12\x02\b\x14bB\b\u0085" + "\xae\xd8\a\x12\"Ǽñě腩膊醬" + "鵨z<\\ȔĒL¹įHEȧ\x1d" + "\x97`\xaf>:\x11>Ý<_ÜH灟鄁" + "姕B\x1c\n\x16/testdata.Tes" + "tVersion1\x12\x02\b\nb)\b\xf8\xb7\x95\x8f" + "\x05\x12\x18侎焬Ȃ囕ƌ丼\xc2" + "\xa6ɣ湚!\x1d\x1cB\x18=:\x02Ʌ\"\xc6\x01\b" + "\x9a\xee\xfe\xc8苤\xd5\xe5\x01\x12\x00\x1a\x00B\x8d\x01\n\x16/" + "testdata.TestVersion" + "3\x12s\b\xad\xc8\xf7\xfa\xed\xc0\xaa\x87\xfc\x01\x12\x00\x1a\x00B\x1c" + "\n\x16/testdata.TestVers" + "ion1\x12\x02\b\nbD\b\xa0\xc9\xfa\xfb\xfb\xff\xff\xff\xff" + "\x01\x12\x1fǓ@Á卒ÿ5N鐴ō" + "簯淕茊羪ȍ\x1d\xec\xe2Y?:" + "\x11Ƭ2Ż{Aȩ镛ȧ瀮b%" + "\b\U000c9731\xfc\xff\xff\xff\xff\x01\x12\b笧k9ȅ" + "3\x1d\n\x8d\xee>:\tçőZǫʮ\"\xa7\x01" + "\b\xd6\xc1\xa0\xbe\xa9\xccۿ\xcd\x01\x12\x00\x1a\x00Bi\n\x16/" + "testdata.TestVersion" + "3\x12O\b\xe3\xc0\xcf\xcc\xd3\xecǺ\x15\x12\x00\x1a\x00B\x1c\n" + "\x16/testdata.TestVersi" + "on2\x12\x02\b\x14b!\b\xed\xab\xec\xd9\xfa\xff\xff\xff\xff\x01" + "\x12\x02©\x1d\x99\xf0a?:\vH氉Aʄɡ" + "ǽb+\b\xef\xe5\xe9\xfe\xfe\xff\xff\xff\xff\x01\x12\x14黁" + "鐩ɚÅư垬螐W?\x1dj\x1d" + "\x12?:\x03骡\"\x91\v\b\x85\xa9\xe0\xcdܠ\x98\xe3\xd4" + "\x01\x12\x00\x1a\x00*\xd0\x01\b\xf7უ\xcf\xe7烫\x01\x12" + "\x00\x1an\b\xa7\x8c\xc5\xd3\xdc\xd6\xd5\xc23\x12\x00\x1a\x00B\x1c\n" + "\x16/testdata.TestVersi" + "on2\x12\x02\b\x14b@\b\x99\x99\xe4o\x12\x0e礈M" + "G肛锕ø9\x1d\\\x02A?:$怫" + "梧泭剝xħhȢ駉ƨ" + "鵸ȚP=ŶĆ¹B\x1c\n\x16/te" + "stdata.TestVersion1\x12" + "\x02\b\nb3\b\xbc\xa3\xb1\xcf\x05\x12\x11-,赴ǣ" + "瞌Ŧ!G錡\x1d\xcb\xea\xed<:\x13ʣz" + "萈ɠü¡î¥Sĭ*z\b\xbf" + "\xff\xf4\xbc\x9c\xa3\xa7\x8e\x8f\x01\x12\x00\x1a\x00B\x1c\n\x16/te" + "stdata.TestVersion2\x12" + "\x02\b\x14bK\b\xf8\xfc\x8e\x9e\xfd\xff\xff\xff\xff\x01\x12\x17\xe8\xa0" + "\xafș達搢źơǟƕD\xe7\x96" + "\x8f\x1dA\x86K?: 窣ǥ邪$李" + "¤ƽ=h歎誩崕唶fy" + "*\xd5\x01\b깩\xfd\x88\x84\xfd\xf8A\x12\x00\x1a\x00B\x86\x01" + "\n\x16/testdata.TestVers" + "ion3\x12l\b\x93\xab\xf7\xf6\xa0ϼ\xb9\xc1\x01\x12\x00\x1a" + "\x00B\x1c\n\x16/testdata.TestV" + "ersion2\x12\x02\b\x14b=\b\xff\x8e\xe9\xea\xfb\xff" + "\xff\xff\xff\x01\x12\x0fŗ缰ňäĥF\xe5\x8c" + "\x89\x1d\xd3\xd5j?:\x1aDŽP1Lʘ ȗö" + "Ĩ3cz紽ȭʗʥb<\b\x83\x92\xb3" + "\x88\xfb\xff\xff\xff\xff\x01\x12\x0fƊ頝*摂Ɇ" + "2餉\x1d\xfd\xf7\xbe=:\x19Ø鎖ƞo\xe6" + "\x91\xad摊菬駞园*V*\xf9\x01\b" + "\xff\xfcʞ\xb3\xab\x97ƽ\x01\x12\xab\x01\b\x8d\x8e\xa0\xf1\xfe\xfc" + "\x85ӏ\x01\x12\x00\x1a\x00Bb\n\x16/testdat" + "a.TestVersion3\x12H\b\xf9\xf7\xd6" + "\xf7\xf5\xc8كy\x12\x00\x1a\x00B\x1c\n\x16/testd" + "ata.TestVersion1\x12\x02\b\n" + "b\x1a\b\xb5\x8e\xa5\x96\xfa\xff\xff\xff\xff\x01\x1d˚O?:\b" + ")E攛稑b6\b\x88\xb4ٻ\x06\x12\bȘ" + "5x=戠\x1d\x86y\r?:\x1fV鞬ŊH" + "謝)熛ËK蓧XkXǬƇ" + "0賘\x1a\x00B\x1c\n\x16/testdata." + "TestVersion1\x12\x02\b\nb\x1e\b\xe4" + "\xa7\x9f\x84\x06\x12\t呯廧.ǂ\x1dx\xf1\a?" + ":\x06&ǩiDz*k\b\xb0뮛\xb8\xc0\xa5\xf9G" + "\x12\x00\x1a\x00B\x1c\n\x16/testdata.Te" + "stVersion2\x12\x02\b\x14b=\b\xa9\x97\xca" + "\xe9\xfa\xff\xff\xff\xff\x01\x12\x19DşɜÞǍí" + "沎Ǩb!嵫U Ǵ\x1d\xd2\xe9i?:" + "\x10{ţŬ|ȤǢeŵ)ę*E\b" + "\xb2\x97\xd0\xca»ϰ\xea\x01\x12\x00\x1a\x00B\x1c\n\x16/t" + "estdata.TestVersion2" + "\x12\x02\b\x14b\x16\bм֔\x02\x1d\x99\x05\x17?:\t\xe5" + "\x90\xba礱Ĕ%*a\b\xebߓ\xeb\xef\xef\xbd\xe8\xcc" + "\x01\x12\x00\x1a\x00B\x1c\n\x16/testdata.T" + "estVersion1\x12\x02\b\nb2\b\x88\x91" + "\xc0\xc0\xff\xff\xff\xff\xff\x01\x12\x0f 焪,ǥ鞘" + "1n碪\x1d\xe0R\b?:\x0fgɪɫ孹" + "R菈侈*\xf5\x01\b\xfd\x8a\xec\xb5͌\xb9\x9d\x99" + "\x01\x12\x00\x1a\x00B\x88\x01\n\x16/testdata." + "TestVersion3\x12n\bǂ\x8c\xbe\xa4" + "\xceܮ\x12\x12\x00\x1a\x00B\x1c\n\x16/testdat" + "a.TestVersion2\x12\x02\b\x14b@" + "\b\xe4\xb2\xd3\xe4\xfa\xff\xff\xff\xff\x01\x12\x14Ų蒿Ǩ" + "ǻ$¢狧ɢ艠\x1d:\x8bg?:\x18" + "őɃȖU爧1#ȗ姱ě{" + "H賦bY\b\xa3\x8e\xa2\x90\x04\x12%咖扆" + "颇ȩʃĆǖO)â復\xe7\x95" + "\xbfsǹGŲ菕;\x1d\xa2(&?:%Y " + "傍Ŧ頖鶜墄ŧ]烉" + "; |Ǎ订Âŕ攲B\x1c\n\x16/" + "testdata.TestVersion" + "2\x12\x02\b\x14b0\b\xe5\xad\xc5\xc0\xff\xff\xff\xff\xff\x01\x12\x17" + "謨ʎč&錅dùȏȑpk" + "ŵW\x1d\xa5\xc3\xcf>:\x05杙ȵ\"\x8b\xf7\xc1\xf4" + "\xa0\xb8\xbb\xe7\xb6\xeeH\x12\x00\x1a\x00B\x1c\n\x16/test" + "data.TestVersion2\x12\x02\b" + "\x14bF\b\xdb֠\xc6\xfd\xff\xff\xff\xff\x01\x12\x1d檨\xe5" + "\xaf\x926惒撂泟}ľ螝,\xc6" + "\x96Fȭl\x1dg\xe4\xe0>:\x15QǓËɳ\xe5" + "\xb5\x84蠈曪疪Ű\"\x83\x01\b\x84\xbb\xf1" + "\xf5\xcbӚ\x9fx\x12\x00\x1a\x00B\x1c\n\x16/testd" + "ata.TestVersion1\x12\x02\b\n" + "bU\bÚ\xee\x91\x03\x12$Ⱦ鴉Ƕ澧" + "ůǝɴ吕歯ƍ6Nj蔻" + "5]Z鵗\x1d\x8e-)?:\"1DɆ嚘" + "ÕQƿǟʖȃƋ倣fʫ(" + "惟薳^\"Y\b\xfb\xda\xdc\xd2\xeb\x94Ð\x11\x12" + "\x00\x1a\x00B\x1c\n\x16/testdata.Tes" + "tVersion1\x12\x02\b\nb+\b\x80\xb8\xda\xe5" + "\xff\xff\xff\xff\xff\x01\x1d\rr\xe0>:\x19}^句\xe8\xbe" + "\x84窀Û1釉%_奾[lj\"\xfb" + "\x11\b\xed\xe6\xd5ħ\x90\x93\x9c\x83\x01\x12\x00\x1a\x00*b\b\xfe" + "\xfd\x9b\xad\x8d\x96\xe9\x8c\\\x12\x00\x1a\x00B\x1c\n\x16/tes" + "tdata.TestVersion2\x12\x02" + "\b\x14b4\b\xc8\xe6ʑ\x05\x12 Y庞埘\xc3" + "\xaf姶/ǬDžŶIƷ鑞@\xe7\xb7" + "\xa7脎\x1dǶ,?:\x05Uʌ¦*\x8d\x02\b" + "\xe1\xfe\xf6\x8b\x91\xe7\xff\x93k\x12\x00\x1a\x00B\xc9\x01\n\x16/t" + "estdata.TestVersion3" + "\x12\xae\x01\b\xbb\xac\x95\x9a\x84\xc7\xde\xf8\x84\x01\x12d\b\xfc\x84\xa2" + "\xf0\xb0\xf0\x8a\xa3R\x12\x00\x1a\x00B\x1c\n\x16/testd" + "ata.TestVersion2\x12\x02\b\x14" + "b6\bс\x80\x85\x05\x12\rŭ.樥Z¡\xc5" + "\xa2SB\x1dX\x818?:\x1at訵ĄɣG\xe8" + "\x95\x99伃ŵ載龻禋\x1a\x00B\x1c" + "\n\x16/testdata.TestVers" + "ion2\x12\x02\b\x14b\x1b\b\xc3\xfbڠ\xf8\xff\xff\xff\xff" + "\x01\x12\x05ɤ´D\x1d\u007f\x84\x8d>:\x02Ⱥb1\b" + "Ⱥ\xb0\xf6\xfb\xff\xff\xff\xff\x01\x12\x12趇Ĥ宠" + "碛ă9ĦĒ\x1d\xb1\xac'?:\v譁" + "宏rIRŎ*r\b\x97\xe5\xf4\xae\x8c\x8b\xbd\xf2\"" + "\x12\x00\x1a\x00B\x1c\n\x16/testdata.Te" + "stVersion1\x12\x02\b\nbD\b\x90\x9a\x98" + "\xd2\xfc\xff\xff\xff\xff\x01\x12\x179岐ƥ協d\xe5" + "\x90\x85卫Ɂµ#Ā\x1dC\x85}?:\x19\xc8" + "\x9d浱Vɜ`ɉ#萠Ù@x\xe5\x8c" + "\x84OtF*t\b\xbc\xaa\u0080\xe2\xfa\x89\x93g\x12\x00\x1a\x00" + "B\x1c\n\x16/testdata.TestVe" + "rsion1\x12\x02\b\nbF\b\xb6\xf7\xdb\xc8\xf9\xff\xff" + "\xff\xff\x01\x12\x1e婮ʼn-7æÎ婶\xe8" + "\x83\xad±箓ǩVȭ覔\x1dc\xe7;?" + ":\x14D瑦7ȦPɺ锽峪V\xc4" + "\x8fk*c\b\x9b\xa9\xa6\xb0\xb1\xb0\x84\xe0\xeb\x01\x12\x00\x1a\x00B" + "\x1c\n\x16/testdata.TestVer" + "sion1\x12\x02\b\nb4\b\xa5\x85\xd8\xe4\xfe\xff\xff\xff" + "\xff\x01\x12\x06µɳĵ\x1d)j\b>:\x1a躹" + "èD|ɒ痧EŴ荩嚶5R" + "藱*g\b\x88\xbc\xe9\x8eΧ\xf6\xd2G\x12\x00\x1a\x00B" + "\x1c\n\x16/testdata.TestVer" + "sion2\x12\x02\b\x14b9\b\xa0\x82\x83\xd5\xf8\xff\xff\xff" + "\xff\x01\x12\x19ȶ%E4ŏȰeYĖ帐" + "稿l^Ïą\x1d\xe0s\x1b?:\f`ʋ\xc8" + "\x9a\"醳N°*\xc3\x05\b\xa3\xff\xeb\x88\xe8\xb6Ж" + "\x1d\x12\x00\x1a\x00B\x82\x05\n\x16/testdata." + "TestVersion3\x12\xe7\x04\b̉\x9c\xf3" + "\x8d\xb5\xb5\xdc\x1b\x12\x00\x1a\x00B\x8b\x04\n\x16/testd" + "ata.TestVersion3\x12\xf0\x03\b" + "\x97\xa6\xfa\xc1\x87\x9d\x88\xab\x1a\x12\x00\x1a\x00B\xbe\x03\n\x16/t" + "estdata.TestVersion3" + "\x12\xa3\x03\b\xfe\xba\xa4\xad\xec\xdc\xf8\xa4}\x12l\bǶ\x90\xcf" + "\x95\xce\u0097d\x12\x00\x1a\x00B\x1c\n\x16/testda" + "ta.TestVersion1\x12\x02\b\nb" + ">\b\xa5\xdd\xc2\xdc\x04\x12\x0e樘魋絷\xe7\x99" + "\xafÄ\x1dO\xc8\xfc<:!圂ŌȻ鼮" + "u]Ȥ`抗諫靓暥痃" + "mÛ\x1a\x00B\xd3\x01\n\x16/testdata." + "TestVersion3\x12\xb8\x01\b\x8c\xbd\xa1\xd7" + "\x84\xdd\xfa\xb6\xbd\x01\x12\x00\x1a\x00By\n\x16/testd" + "ata.TestVersion3\x12_\b\xde" + "\xa7\xc3\xf1\xfaν\xd9T\x12\x00\x1a\x00B\x1c\n\x16/tes" + "tdata.TestVersion1\x12\x02" + "\b\nb1\b\xe4\xfd\x93\xc9\xfb\xff\xff\xff\xff\x01\x12\x06Eq\xe7" + "\x8e\xa3M\x1d\t\\9>:\x17襨ǫ,螬V" + "Mðœ//ǷQ{M^b,\b\x94\x8c\xe9\xbe" + "\xff\xff\xff\xff\xff\x01\x1d\x1ae\xb0=:\x1aƷ溯h\xc7" + "\x86勉霍$ůʕh牱靬b" + "Q\b\xef\xaa\xdd\xe3\xf8\xff\xff\xff\xff\x01\x12#赜褴" + "Xoƞĥ<ɿɛ败Í礩\xe7" + "\x96\xab裤Ō\\z\x1dN\f1?:\x1aɒ_'" + "反莔ȫ(2ĕŮ缟ɞ\xe8" + "\x97\x9bb\x1f\b\x97\xb0\xb5\x9b\x02\x12\r>鮺A睭" + "Ǻ汮\x1d&\x92\xcc=:\x03萵bI\b\xbc\xa0" + "\xc0\x80\xfe\xff\xff\xff\xff\x01\x12\x1dsB犋古ğ" + "焦蔁伱猘Ǔ荪Ƃ\x1d" + "\x13\x8b\x10?:\x18H0J噾ʩ絘盜" + "ʦnjơ峿zb.\b\xff\xb5\xc8\xff\xfb\xff\xff" + "\xff\xff\x01\x12\x11;Ũ?茊d矞cǻ\xe7" + "\xbd\x84\x1dG\x03R?:\t睔Kɕ¹W*\xa9" + "\x03\b\xbeޡ\x98\xa2\xa3\xfd\xdc\r\x12\xd7\x01\b\xb6\x94\x81и" + "ݢ\xc5\xf6\x01\x12\x00\x1a\x00B}\n\x16/testda" + "ta.TestVersion3\x12c\bр" + "ɳ̠Ԉ\f\x12\x00\x1a\x00B\x1c\n\x16/test" + "data.TestVersion1\x12\x02\b" + "\nb5\b\xe0\x83\xf5\xaa\xfe\xff\xff\xff\xff\x01\x12\x10d瑊" + "J5Æ臀ɻQƂ\x1d\xe2\xe0\x94>:\x11:" + "47弈拻鵶赢ȟbG\b\xcd" + "\xc7\xe7\xbd\xf8\xff\xff\xff\xff\x01\x12\"替P鵘Ļ" + "邺鹂6DŽ Q敭gM谱\xca" + "\xa6艿%\x1d\xe19\xa3>:\x11\\焙埅8" + "ƞ坐Ȇź\x1a\x00B\x8b\x01\n\x16/tes" + "tdata.TestVersion3\x12q" + "\b\x98\x8b\x93\x84Ӎ\xf9\x8d\x03\x12\x00\x1a\x00B\x1c\n\x16/t" + "estdata.TestVersion2" + "\x12\x02\b\x14bC\b픠\xcd\xfd\xff\xff\xff\xff\x01\x12\x13\xc4" + "\x85営ʖ擠傔簃雜\x1dW" + "7o?:\x1c0v-Ȓ本囒«0I" + "ȽƩǻƢrVȄub3\b\x8d\xe7\xa0\xcb" + "\xff\xff\xff\xff\xff\x01\x12\aȏG鐋T\x1d]\x04\xcb>" + ":\x18嗛訯T¤61Hŀȵǘ" + "Z_+.ʘ*o\b\xb1\xc9ת\x9f\xfa\xac\xd5\x14\x12\x00" + "\x1a\x00B\x1c\n\x16/testdata.Test" + "Version2\x12\x02\b\x14bA\b\u0601\x95\x81\x02" + "\x12(酤ē橢Ť皞b8簅" + "ăėǙȏ#fʠ愶ũ´\xe9" + "\xad\x89\x1d\x93\x8a\xd6>:\nXG烸,ssǚB" + "\x8e\x01\n\x16/testdata.TestVe" + "rsion3\x12t\b\xca\xcb\xf3\xf9\xe8\xdb\xcc\xc0\xfe\x01\x12" + "\x00\x1a\x00B\x1c\n\x16/testdata.Tes" + "tVersion2\x12\x02\b\x14bE\b\x99\x82\xa7\xb1" + "\xff\xff\xff\xff\xff\x01\x12\x1ec馯kl犀*3\xc9" + "\x90珓ZČ雳Õ灠7ȣ\x1d\x82" + "\xdd\xd9>:\x13s鄠嗗}'蠼aR\xe6" + "\x84\x83:2bJ\b\x8b\x80\x99\xaf\x02\x12\x15ʌ裱y" + "n壢嫛yL負鍐\x1d\x80\xb8\x1c?" + ":&ɋ趪酅杚êi欯\xe7" + "\x97\x8e輋>ɟij^ď貀扢:" + "Be\n\x16/testdata.TestVe" + "rsion3\x12K\b\xa2\x80\xb3Ƒ\xb9\x8f\xe2\xaa\x01\x12" + "\x00\x1a\x00B\x1c\n\x16/testdata.Tes" + "tVersion2\x12\x02\b\x14b\x1c\b\xf8\x99\x8a\xf9" + "\x03\x1dƩ(?:\x0f`栜żȺʪƴ" + "狼b\x0f\b\x84\xc0\xb3\xe6\x05\x1dSVY?:\x02Ĭ" + "*\x98\x02\b\xa3މ\xca\xf0甸\xf2\x01\x12\x00\x1a\x00B\xd6" + "\x01\n\x16/testdata.TestVer" + "sion3\x12\xbb\x01\b\xf6\xed\xbfԃ\xfe\xab\xed$\x12\x00" + "\x1a\x00Bt\n\x16/testdata.Test" + "Version3\x12Z\b\xd4\xce\xfc\xfa\x93ř\xf5K" + "\x12\x00\x1a\x00B\x1c\n\x16/testdata.Te" + "stVersion2\x12\x02\b\x14b,\b\xee\xee\xe8" + "\x8d\a\x12\x19ňDŽď6鏻c鎬a\xc7" + "\xb7-ç僔;3\x1dK\xacd?:\x04ʝȘ" + "b5\b\x9a\xc7\xf8\xdb\xff\xff\xff\xff\xff\x01\x12\bƥ详" + "荵\x1d\xad\xc2s?:\x19釤ƃ鈅\xe7\xa7" + "\xbdŭɈŃq湘脨\"b.\b\xf4\xb4" + "Ն\x06\x12\x15ʎ哀艶穢躴\xc5" + "\xb2兮Ȧ\x1d\x1e\r\b?:\nNX瞼ì" + "廋*^\b\xc5\xe9\xab\xe1\xb5\xfc\xfd\x82\xd8\x01\x12\x00\x1a\x00" + "B\x1c\n\x16/testdata.TestVe" + "rsion1\x12\x02\b\nb/\b\x85\xf8\xc6\xfa\x05\x12\x17" + "P31ɡ蚠@ǭ疳馅;\\\xc3" + "\xb0ɸ\x1d \xa2\f>:\tŜ嬐J冃*" + "\xad\x02\b\x95\U000a6056\xa4\xf7\xa2\xf6\x01\x12\x00\x1a\x00B\xf4\x01" + "\n\x16/testdata.TestVers" + "ion3\x12\xd9\x01\b\x8c\x80\xe7\xb6\xe8\x90\xfa\xc2C\x12\x00\x1a" + "w\b\xbb\x99\x93\xfe\xa5\xbb\x9a\x9d\xef\x01\x12\x00\x1a\x00B\x1c\n\x16" + "/testdata.TestVersio" + "n2\x12\x02\b\x14bH\bՑ\xd2\xd2\xff\xff\xff\xff\xff\x01\x12" + "\x1eɫZ6I(l熭śũNJ垷" + "ɝ*瓆哤ɂ\x1d:җ>:\x16ĕ" + "簶ŵ鶿ʍ]ËŦæʛl" + "B\x1c\n\x16/testdata.TestVe" + "rsion1\x12\x02\b\nb4\b\xda\xe2\xc2\xcf\xf9\xff\xff" + "\xff\xff\x01\x12\x1c齺酣振\u00a0ċ@n" + "Î缞ƫ(qA薆\x1dw\x0fA?:\x04" + "N亗b%\bƶ\xeb\xcb\x05\x12\x01|\x1dNʖ>" + ":\x15R櫴w;齞PEȿŤŘ\xe5" + "\xba\xabR*a\b\xc2땸\xe8\xc8\xed\xd3\x12\x12\x00\x1a\x00B" + "\x1c\n\x16/testdata.TestVer" + "sion1\x12\x02\b\nb3\b\xaa\xac\x8a\xcb\xfe\xff\xff\xff" + "\xff\x01\x12\x04ƵȽ\x1do\xcfo>:\x1bƗ×\xe8" + "\xb1\x95幷汁ċ菗辪pʣ\xe6" + "\xb5\x85B\x1c\n\x16/testdata.Test" + "Version2\x12\x02\b\x14b\x15\bǜ\xbd\xa9\x01" + "\x1d\xd5\xf0 ?:\b¶Ë楔X\x1a\x00\"\xb9\x01" + "\b\xc9埸\xe0\xda\xfa\xa8\x81\x01\x12`\b\x8c\xf1\xe1݆\xbc" + "\xc6\xd4?\x12\x00\x1a\x00B\x1c\n\x16/testdata" + ".TestVersion2\x12\x02\b\x14b2\b" + "\xad\x91\xea\xc1\xf9\xff\xff\xff\xff\x01\x12\x12Gŗ¹e\xe6\xb7" + "\xbf紌焗誑\x1d\xb8\xefs?:\fä\xe8" + "\x8d\xbeŲF抦K\x1a\x00B\x1c\n\x16/test" + "data.TestVersion2\x12\x02\b" + "\x14b*\b\xff\xe2\xec\x96\xfd\xff\xff\xff\xff\x01\x12\f灏\xe9" + "\x9a\xbeʮ¶Zg\x1dq\\G?:\n懧ɱ" + "Xūʚ\"a\b֙\xb1\x9e\x9f\xd7\xd1\xd8\x13\x12\x00\x1a" + "\x00B\x1c\n\x16/testdata.TestV" + "ersion2\x12\x02\b\x14b3\bڋ\xba\xfb\xfb\xff" + "\xff\xff\xff\x01\x12\x10ɐ萱^粫棟Ȇ" + "o[\x1d~>\xcb>:\x0f逪ų栳僳" + "Ɩ0K\"g\b\xa3\xbb\x9b\x86嘹\xb54\x12\x00\x1a\x00" + "B\x1c\n\x16/testdata.TestVe" + "rsion1\x12\x02\b\nb9\b\xee\xfd\xb5\xa9\x06\x12\x15" + "箩晎ə堫梉ɧƿtv" + "p\x1df\xbf'?:\x15ȩ轻4ʞ倾\xe9" + "\xae\x88Ț桟Ļ\"e\b\xf6\xf0\xa5\xfc˖\xc5\xf1" + "\x98\x01\x12\x00\x1a\x00B\x1c\n\x16/testdata." + "TestVersion2\x12\x02\b\x14b6\b\xad" + "\xda\xfc\xca\a\x12\x1aH9_ǩĬZ所k\xe7\x8c" + "\x86濶X疎秖a\x1d\x90no?:\r\xc2" + "\xab鼌k洅ʃi}\"u\b\x82\xfc\xc4Ř" + "\xfc\xb5\x84\xf0\x01\x12\x00\x1a\x00B\x1c\n\x16/testda" + "ta.TestVersion2\x12\x02\b\x14b" + "F\b\xf8\xbb\xe8\xba\xff\xff\xff\xff\xff\x01\x12\x1dd斠&]" + "'视m壡ďº荞淜\xe9\xae" + "\xb3lj\x1d\xf8\x03#?:\x15ǚD£陽\xe8\xa6" + "\xa70Uz騪簅2\"W\b\xf1\xe9\xf1\xe9\xf2\xfc" + "\xf0\xd4\xf0\x01\x12\x00\x1a\x00B\x1c\n\x16/testdat" + "a.TestVersion2\x12\x02\b\x14b(" + "\b\xe3ڹ\xf7\xfa\xff\xff\xff\xff\x01\x12\x04|疔\x1d\xf0\xd1" + "#?:\x10雘力ɔƂ髾Ȏ_" + "\"z\b\x90\xea\xc1\xd7\xd5\xe1\x84\xd9\x02\x12\x00\x1a\x00B\x1c\n\x16" + "/testdata.TestVersio" + "n1\x12\x02\b\nbL\b\xe7\xaf˸\x06\x12'>ÈI" + "ʑƆƗ汁熚寢痵à" + "Ò\"9杧Ɓf蹭Ʒ\x1dP'g?" + ":\x16螪驡ÄZ fʚ=8ƌ\xe8" + "\xb5\x8bř\"\x82\x12\bƩ臧\x9e\xa1\x95}\x12\x00\x1a" + "\x90\x10\b\xb4\xaaݫ\xed\xf9\xb5\x9d\xda\x01\x12\x00\x1a\xa5\x0f\b\x94" + "\x9d\xe4\xfaɍ\x90ɤ\x01\x12\x00\x1a\xa3\x02\b\xa9\xf0\x8a\xfa\xe3" + "\xccڭ\xc6\x01\x12\x00\x1a/B\xe3\x01\n\x16/testd" + "ata.TestVersion3\x12\xc8\x01\b" + "\x95\x87\xd4\xcd\xe5\xb8\xe9\xf3j\x12\x00\x1a\x00B\x84\x01\n\x16/t" + "estdata.TestVersion3" + "\x12j\b铞\xff\xf9릇\xc8\x01\x12\x00\x1a\x00B\x1c\n" + "\x16/testdata.TestVersi" + "on2\x12\x02\b\x14b;\b\xaf\x81\x82\xc9\xf8\xff\xff\xff\xff\x01" + "\x12 鏽殨T疠ȉ鴫ʡB" + "(ǼZ贋hR#诲n\x1d\xaf\xd9\t?:" + "\a鍹DIʩb1\b\xaf\xfa\xc8\xf2\xfa\xff\xff\xff\xff" + "\x01\x12\x17谁ɶ=ƀO桒繫ɂ" + "黓,ơ\x1d\x12\xf6\\?:\x06瀸6¾b" + ",\b\xa2\x91ˡ\x06\x12\x10ɤnzƟ@戍T" + "p枏X\x1dY\xabr?:\rD涉Ƹw\xc6" + "\xb4Ǐǜ\"V\b\xef\x84\xeeޠ\x8e\xbd\x8el\x12\x00\x1a" + "\x00B\x1c\n\x16/testdata.TestV" + "ersion1\x12\x02\b\nb(\b\xdb\xce\xf3~\x12\x0e" + "Š褰k|«聩Gf\x1d\x81\xf2\x9c>:" + "\f訟\"Fɉɸ韊\"]\b\xf1\xe4\xa8\xcd" + "\x9c櫽\xff\x01\x12\x00\x1a\x00B\x1c\n\x16/testd" + "ata.TestVersion1\x12\x02\b\n" + "b.\b\xfd̽\x9a\x03\x12\x0e7[ȝŖƞʏ" + "ʀă\x1d\xac\x01\xc7>:\x111Z椸5ªD" + "髶m»>'\"\xe1\x01\b\x84\xd5\xd0Ӟ\xa7\x84\xfa" + "\xd6\x01\x12\x00\x1a\x00B\x8b\x01\n\x16/testdata" + ".TestVersion3\x12q\b\x84\xc9\xe1\xd4" + "Ǹ\xa9\x8f\x03\x12\x00\x1a\x00B\x1c\n\x16/testda" + "ta.TestVersion2\x12\x02\b\x14b" + "C\b\xf2닶\x01\x12\x11^下攚慯\xe9" + "\x85\xab:\x1bĻ芙ȄɆ3" + "粓<喁y庉ʍR鱮\"\x86\x01" + "\b\xcd\xcc\xc8\xeb\xe6֎\xfb\xa2\x01\x12\x00\x1a\x00B\x1c\n\x16/" + "testdata.TestVersion" + "2\x12\x02\b\x14bW\b\xbc\xe6\x9e\xfd\x02\x12\"ȓű\xc6" + "\xb4粆櫣>#|H靵ƌU l\xe8" + "\xae\x9bǥ搼ǩ\x1dw\xf6\x18>:&载\xe7" + "\xbb\x89h1Gtzëÿ皛谲隮" + "ɘɝUǼ俪Ųē\"\x9c\x02\b\xb8\xd5" + "\xbb\x81\xfd\xa7\x98\x86\xb0\x01\x12\x00\x1a\x00B\xd5\x01\n\x16/te" + "stdata.TestVersion3\x12" + "\xba\x01\b\x94\xcb겨\u05fbގ\x01\x12\x00\x1ag\b\xfa\x8f" + "\x98\xbe\xb4\x86\xb2\xfb\xb7\x01\x12\x00\x1a\x00B\x1c\n\x16/tes" + "tdata.TestVersion1\x12\x02" + "\b\nb8\b\x81\xee\xf6\xb1\xfb\xff\xff\xff\xff\x01\x12 嵁" + "ǯŖĔ'ƙ³?瑛Ȯ1{\xc3" + "\xa7Ŀ9tŃÓ\x1d\xb0s(?:\x04-8ż" + "B\x1c\n\x16/testdata.TestVe" + "rsion1\x12\x02\b\nb$\b\xb3\xdb\xe0\xad\xf8\xff\xff" + "\xff\xff\x01\x12\x01V\x1d\xacـ>:\x0f磥驈\xe7" + "\xbc\x94頄ʪmb3\b\xf1\x9c\xfc9\x12\x19d\xe7\xa5" + "\xaeI瞼ƣBčf谌ȃnĜ\xe5" + "\xa7\xbf\x1d\t\x96L?:\f!剱ǟ郝\xe9\xbd" + "\xa1\"h\b\xf2\xe0\xd8\xdb\xe6\xa9\xcb\xdc\x1d\x12\x00\x1a\x00B\x1c\n" + "\x16/testdata.TestVersi" + "on1\x12\x02\b\nb:\bÏ\xce\xe1\x01\x12\x174iK" + "œ裕ēȁĺ`藃ǁ苍" + "\x1ds{V?:\x14)釧漌FqǾx%" + "¬ʊ抄\"\xd9\x02\b\x91\x96\x8e\xb3\xc4\xcf\xe9\xa1s" + "\x12\x00\x1a\x00B\x85\x02\n\x16/testdata.T" + "estVersion3\x12\xea\x01\b\xfd\xb8\xaa\xbd\xfc" + "\xbc\xdc\xc4%\x12\x00\x1a\x00B\xa4\x01\n\x16/testda" + "ta.TestVersion3\x12\x89\x01\b\xfc" + "؛\x9e\x94\xc1\xe3\xc4<\x12\x00\x1a\x00B\x1c\n\x16/tes" + "tdata.TestVersion2\x12\x02" + "\b\x14b[\b\xc4Ӏ\xf6\x04\x12*s岠d贕" + "r药ĝ杮ɡ孥臟嬠" + "躶Ă鏎Ů糭/\x1d1\xd5[>:" + "\"0橱僎?Ä壜/礂[/" + "_逛XR偙鏅初b3\b\x8d\x8a" + "\xe9\xf2\xf9\xff\xff\xff\xff\x01\x12!§ǹǘʘ\xe8\xb0" + "\x98癶ŞDŽ饖艕騲WB\xe9" + "\x94\x8ek\x1d\xc9|p>bA\b\x9b\xb8\xbd\xfb\x05\x12\"XN" + "ɶʏĹǯ歆Q颴ĪɈ\xc2" + "\xa2餃Ⱥ随霻\x1d\xd0\xc7\xc8>:\x10\xc3" + "\xac幙央ȹ唭鍵B\x1c\n\x16/" + "testdata.TestVersion" + "1\x12\x02\b\nbD\b\xf7\xcf\xc0\x97\x02\x12\x13V郳\xe9" + "\xa9\xa96?ƍ¹ʭNƵg\x1d}\bR?:" + "\"ŀÊŨ蔙BvPĤG傚t" + "隃钩檮R討ÕB\x1c\n\x16/" + "testdata.TestVersion" + "2\x12\x02\b\x14b;\b\xe3\x8f\xd4\xc7\xfc\xff\xff\xff\xff\x01\x12)" + "劕>鵉ʓ鑫5[窚礁" + "ǰ奣驓奤碏漕Ä\xc6" + "\x8a\x1d;\xe9,?B\x97\x01\n\x16/testdata" + ".TestVersion3\x12}\b\xf0\xb1\xf6\x8d" + "\xaa\xe6\xc6\xc9\xd7\x01\x12\x00\x1a\x00B\x1c\n\x16/testd" + "ata.TestVersion1\x12\x02\b\n" + "bN\b\xfb\xa1\x89\xb4\xf8\xff\xff\xff\xff\x01\x12%Ǐ»L" + "蔧已ė<ʓ髍ʖWc\xe5\xba" + "\x84uĉ椛Ǭ樱\x1d\xe1\\T?:\x15\xc8" + "\xa9'ʌ鈹ȧA-Ȣ飔Z饶" + "bG\b\xd6\xd9\xc1\xf0\a\x12\x13hP\\QY榟b<" + "05虸ɭ°\x1d\x03rE?:%Q,Ŏ" + "S=佔b臞ɢJ°坎贴" + "鬛猿M欯Ĵm\"\x8c\x01\b\xe4\xd9\xed" + "\x80\xfa\xcc\xf9\x9a;\x12H\b\x8cƠ\xbb\xf8\x92\x8d\x9b\x17\x12\x00" + "\x1a\x00B\x1c\n\x16/testdata.Test" + "Version1\x12\x02\b\nb\x1a\b\xe5\x8a֮\a" + "\x12\rƒ7ʨZȢxjɲ&\x1d^\xc2[?" + "\x1a\x00B\x1c\n\x16/testdata.Test" + "Version2\x12\x02\b\x14b\x16\b\xa1\xff\x88\xf3\x03" + "\x1dE\xc3\xc3>:\t帙Z愆£\"\xe0\x04\b" + "\xbb\x85\xfa\xa9\xa7\xd2\xf4\xc3I\x12\x00\x1a\x00B\xae\x04\n\x16/t" + "estdata.TestVersion3" + "\x12\x93\x04\b\xa8뒨\xa2\x88\x91\x86#\x12\x00\x1a\x00B\xbc\x03" + "\n\x16/testdata.TestVers" + "ion3\x12\xa1\x03\b\x93\x96\xa6\x9cNJ\xfc\xa3#\x12\x00\x1a" + "\xab\x02\b\xa8\xf1\x9c\xe3\xcd\xf4\xcf\xc1\xe7\x01\x12\x00\x1a\x00B\xe1\x01" + "\n\x16/testdata.TestVers" + "ion3\x12\xc6\x01\b\xf6\x87\x86\xa0\xd0\xcd\xc1\xaa\xa8\x01\x12\x00" + "\x1a\x00Bw\n\x16/testdata.Test" + "Version3\x12]\b\xb8\x99\xc1\xc8\xfa\xe8\xf1\xa7\xdc" + "\x01\x12\x00\x1a\x00B\x1c\n\x16/testdata.T" + "estVersion1\x12\x02\b\nb.\b\xf9\xe1" + "\xf1\xac\xf9\xff\xff\xff\xff\x01\x12\x10ÕĨ箞 '\xe8" + "\x97\x9eV_ɭ\x1d\xad\xd5\xcd<:\n趙Ü9\xc8" + "\x81#Xb<\b\x8a\xbd\x9b\xf7\xff\xff\xff\xff\xff\x01\x12!*\xc3" + "\xb4Ë[拭紱ǔAN_=歜]" + "攣o#ʜ\\綉\x1d\x95\xac\xc4>:\aK\xc3" + "\xa6gØIb6\b\xb9\xd6ߚ\xfc\xff\xff\xff\xff\x01\x12\x02" + "á\x1d\x1e\x18\x10?: ŀ`ʎó蜱Y" + "暎蹫忣ƶp{爩$D\xe7\x94" + "\x97B\x1c\n\x16/testdata.TestV" + "ersion2\x12\x02\b\x14bG\b\xab\xa9\xe8\xe8\x02\x12" + "(Ġ韞?踠庬ƿɝĩ\xc4" + "\xbe顗Ȇ蜤ɑǑ@ȿ碯\xc3" + "\x9d\x1dSS\x88>:\x10÷甥賧藻M" + "p贱bD\b\x99\xe2\x93\xd4\x06\x12%üĔʆ" + "}ɆƍƏɞ6鴈ɚ鼈\xe9\x9d" + "\x8et»ǹ霌ʙ\x1d\xcc}\x02?:\x10=\xe7" + "\xa9\x90@ijA;勛镐Wb\x1f\b\xa5\xcf\xd9" + "\x9a\xff\xff\xff\xff\xff\x01\x12\x04篌|\x1d\xa0ob?:\a" + "ƕȍ澄B\x1c\n\x16/testdata" + ".TestVersion1\x12\x02\b\nb!\b" + "\xa3\xb6Ɠ\xfd\xff\xff\xff\xff\x01\x12\x01f\x1d\x02\xd7\xdc=:\f" + "泡ď嘳5°t\x1a\x81\x04\b\u07b3\xe7\xfb" + "\x99˖\xdc6\x12\x00\x1a\x00B\xcc\x03\n\x16/testd" + "ata.TestVersion3\x12\xb1\x03\b" + "\xe0\xe4\xd7\xf2\xa3\xb6\xf0\xd0i\x12\x00\x1a\x00B\xe6\x02\n\x16/t" + "estdata.TestVersion3" + "\x12\xcb\x02\b\x8d\xe9â\xc9\xdd\xff\x94\x93\x01\x12\x00\x1a\x00B\x92" + "\x02\n\x16/testdata.TestVer" + "sion3\x12\xf7\x01\b\xf3㡂\x95\xf6\u061d\xcd\x01\x12" + "\x00\x1a\x86\x01\b\xfa\xec\xf4\xca\xf1\xb3\xb2ă\x01\x12\x00\x1a\x00B" + "\x1c\n\x16/testdata.TestVer" + "sion2\x12\x02\b\x14bW\b\xb8\xf8\x93\xf3\xfc\xff\xff\xff" + "\xff\x01\x12(B裧轧Ț=N鴬ǭ" + "岨ī灠7iƔ鄱雦ȝ" + "B悀\x1d\xc3d\xa7=:\x1b$\\ɪ鼑ʀ" + "碏覴犉FHɩ]ǣǠB\x1c" + "\n\x16/testdata.TestVers" + "ion1\x12\x02\b\nbA\b\x93\xab\x8c\xe5\x01\x12\x1e\xe7\x91" + "\x98*枯uo2ɚ@½塪矼5" + "锶ʝ烎\x1d\x87\x94\x15?:\x14駄Nj" + "7Ji砋c噚Ƀ:Ȋb%\b\x97\x8f" + "\x87\x1d\x12\x16ƺē脧:Ò麸SeS" + "O氘Ð\x1d?\x18\x17?:\x01@b8\bң\xf9" + "\x8a\xfb\xff\xff\xff\xff\x01\x12\x1aɞŋƱwɑ\xe9\xa4" + "\x92瓢董ȑ>«ői\x1d3\xe1\x84>" + ":\n胊Īƚpǥb\"\b\x95\x9e\xe2\x95\a" + "\x1d\xbe,??:\x15źR10ʂ绻綏" + "ĄŕɆʋb@\b\x86\xd5\xce\xd7\xfe\xff\xff\xff\xff" + "\x01\x12\x16ʗ+鑧垙闚Ĺū\xe7" + "\xab\x8f渊\x1d\xf8\xc3\x0f?:\x16篇ľ}6\xe7" + "\xae\x90^苋Ĩ辦籼r%\b\x83\xae\xf9" + "\x89\xac\xe1\xbb\xd0O\x12\v防dsVé笱\x1a" + "\f\n\x02ɯ\x12\x06恝ɓDz^\n\x17]^\xc4" + "\x87^ʑƔlƏ煹ƵȤɐċ" + "\x12\x1e鉼ȳp鴨扶ǠƆǶ" + "吴ɻɎ鴉Ʉ\x1a#\n\x04?ȇS" + "\x12\x1bY船=0x鿝ě&搼/\xe7" + "\x86\xa1emƲ扔" ```

Version

Steps to Reproduce


For Admin Use

aaronc commented 4 years ago

Thanks @odeke-em. Are you able to work on a fix? If not I'll make sure our team gets to it.

amaury1093 commented 4 years ago

@odeke-em would you be able to provide the original unmarshalled struct?

odeke-em commented 4 years ago

Sorry for the late replies, I've debugged this and it looks like another case where my fuzz pass generated a struct, mutated it, proto marshalled and also mutated that output before writing it to file. The reasoning is because that crash is when unmarshalling field 4 which is a slice of []*testutil/testdata.TestVersion1 https://github.com/cosmos/cosmos-sdk/blob/97df8b605ce2839e496cf97ab783f89c72874289/testutil/testdata/proto.pb.go#L1461 but with a claimed length of >= 3949355340974291851 which is >=1.8 billion times larger than sizeof(int) which is what length can store. and that's impossible to handle in memory and even judging by the number of bytes left before that EOF.

My apologies again, but I'll refine the fuzzer in the next rounds. Stargate lives on!