@@ -23,29 +23,22 @@ var XdrFilesSHA256 = map[string]string{
2323 "spec/fixtures/generator/const.x" : "0bff3b37592fcc16cad2fe10b9a72f5d39d033a114917c24e86a9ebd9cda9c37" ,
2424}
2525
26- var ErrMaxDecodingDepthReached = errors .New ("maximum decoding depth reached" )
27-
2826type xdrType interface {
2927 xdrType ()
3028}
3129
32- type decoderFrom interface {
33- DecodeFrom (d * xdr.Decoder , maxDepth uint ) (int , error )
34- }
35-
36- // Unmarshal reads an xdr element from `r` into `v`.
37- func Unmarshal (r io.Reader , v interface {}) (int , error ) {
38- return UnmarshalWithOptions (r , v , xdr .DefaultDecodeOptions )
39- }
30+ // ErrMaxDecodingDepthReached is returned when the maximum decoding depth is
31+ // exceeded. This prevents stack overflow from deeply nested structures.
32+ var ErrMaxDecodingDepthReached = errors .New ("maximum decoding depth reached" )
4033
41- // UnmarshalWithOptions works like Unmarshal but uses decoding options .
42- func UnmarshalWithOptions ( r io. Reader , v interface {}, options xdr. DecodeOptions ) (int , error ) {
43- if decodable , ok := v .(decoderFrom ); ok {
44- d := xdr .NewDecoderWithOptions ( r , options )
45- return decodable .DecodeFrom (d , options .MaxDepth )
34+ // Unmarshal reads an xdr element from `data` into `v` .
35+ func Unmarshal ( data [] byte , v interface {}) (int , error ) {
36+ if decodable , ok := v .(xdr. DecoderFrom ); ok {
37+ d := xdr .NewDecoder ( data )
38+ return decodable .DecodeFrom (d , d .MaxDepth () )
4639 }
4740 // delegate to xdr package's Unmarshal
48- return xdr .UnmarshalWithOptions ( r , v , options )
41+ return xdr .Unmarshal ( data , v )
4942}
5043
5144// Marshal writes an xdr element `v` into `w`.
@@ -77,14 +70,16 @@ type TestArray [Foo]int32
7770// EncodeTo encodes this value using the Encoder.
7871func (s * TestArray ) EncodeTo (e * xdr.Encoder ) error {
7972 var err error
80- if _ , err = e .EncodeInt (int32 (s )); err != nil {
73+ for i := 0 ; i < len (s ); i ++ {
74+ if _ , err = e .EncodeInt (int32 (s [i ])); err != nil {
8175 return err
8276 }
77+ }
8378 return nil
8479}
8580
86- var _ decoderFrom = (* TestArray )(nil )
87- // DecodeFrom decodes this value using the Decoder .
81+ var _ xdr. DecoderFrom = (* TestArray )(nil )
82+ // DecodeFrom decodes this value from the given decoder .
8883func (s * TestArray ) DecodeFrom (d * xdr.Decoder , maxDepth uint ) (int , error ) {
8984 if maxDepth == 0 {
9085 return 0 , fmt .Errorf ("decoding TestArray: %w" , ErrMaxDecodingDepthReached )
@@ -93,11 +88,13 @@ func (s *TestArray) DecodeFrom(d *xdr.Decoder, maxDepth uint) (int, error) {
9388 var err error
9489 var n , nTmp int
9590 var v [Foo ]int32
96- v , nTmp , err = d .DecodeInt ()
91+ for i := 0 ; i < len (v ); i ++ {
92+ v [i ], nTmp , err = d .DecodeInt ()
9793 n += nTmp
9894 if err != nil {
9995 return n , fmt .Errorf ("decoding Int: %w" , err )
10096 }
97+ }
10198 * s = TestArray (v )
10299 return n , nil
103100}
@@ -112,11 +109,8 @@ func (s TestArray) MarshalBinary() ([]byte, error) {
112109
113110// UnmarshalBinary implements encoding.BinaryUnmarshaler.
114111func (s * TestArray ) UnmarshalBinary (inp []byte ) error {
115- r := bytes .NewReader (inp )
116- o := xdr .DefaultDecodeOptions
117- o .MaxInputLen = len (inp )
118- d := xdr .NewDecoderWithOptions (r , o )
119- _ , err := s .DecodeFrom (d , o .MaxDepth )
112+ d := xdr .NewDecoder (inp )
113+ _ , err := s .DecodeFrom (d , d .MaxDepth ())
120114 return err
121115}
122116
@@ -142,14 +136,19 @@ func (e TestArray2) XDRMaxSize() int {
142136// EncodeTo encodes this value using the Encoder.
143137func (s TestArray2 ) EncodeTo (e * xdr.Encoder ) error {
144138 var err error
145- if _ , err = e .EncodeInt (int32 (s )); err != nil {
139+ if _ , err = e .EncodeUint (uint32 (len (s ))); err != nil {
140+ return err
141+ }
142+ for i := 0 ; i < len (s ); i ++ {
143+ if _ , err = e .EncodeInt (int32 (s [i ])); err != nil {
146144 return err
147145 }
146+ }
148147 return nil
149148}
150149
151- var _ decoderFrom = (* TestArray2 )(nil )
152- // DecodeFrom decodes this value using the Decoder .
150+ var _ xdr. DecoderFrom = (* TestArray2 )(nil )
151+ // DecodeFrom decodes this value from the given decoder .
153152func (s * TestArray2 ) DecodeFrom (d * xdr.Decoder , maxDepth uint ) (int , error ) {
154153 if maxDepth == 0 {
155154 return 0 , fmt .Errorf ("decoding TestArray2: %w" , ErrMaxDecodingDepthReached )
@@ -158,10 +157,33 @@ func (s *TestArray2) DecodeFrom(d *xdr.Decoder, maxDepth uint) (int, error) {
158157 var err error
159158 var n , nTmp int
160159 var v []int32
161- v , nTmp , err = d .DecodeInt ()
160+ var l uint32
161+ l , nTmp , err = d .DecodeUint ()
162+ n += nTmp
163+ if err != nil {
164+ return n , fmt .Errorf ("decoding Int: %w" , err )
165+ }
166+ if l > 1 {
167+ return n , fmt .Errorf ("decoding int32: data size (%d) exceeds size limit (1)" , l )
168+ }
169+ if l == 0 {
170+ v = v [:0 ]
171+ } else {
172+ if uint (d .Remaining ()) < uint (l ) {
173+ return n , fmt .Errorf ("decoding int32: length (%d) exceeds remaining input length (%d)" , l , d .Remaining ())
174+ }
175+ if cap (v ) >= int (l ) {
176+ v = v [:l ]
177+ } else {
178+ v = make ([]int32 , l )
179+ }
180+ for i := uint32 (0 ); i < l ; i ++ {
181+ v [i ], nTmp , err = d .DecodeInt ()
162182 n += nTmp
163183 if err != nil {
164184 return n , fmt .Errorf ("decoding Int: %w" , err )
185+ }
186+ }
165187 }
166188 * s = TestArray2 (v )
167189 return n , nil
@@ -177,11 +199,8 @@ func (s TestArray2) MarshalBinary() ([]byte, error) {
177199
178200// UnmarshalBinary implements encoding.BinaryUnmarshaler.
179201func (s * TestArray2 ) UnmarshalBinary (inp []byte ) error {
180- r := bytes .NewReader (inp )
181- o := xdr .DefaultDecodeOptions
182- o .MaxInputLen = len (inp )
183- d := xdr .NewDecoderWithOptions (r , o )
184- _ , err := s .DecodeFrom (d , o .MaxDepth )
202+ d := xdr .NewDecoder (inp )
203+ _ , err := s .DecodeFrom (d , d .MaxDepth ())
185204 return err
186205}
187206
0 commit comments