@@ -172,7 +172,7 @@ func ParseXUDT(b []byte) (*XUDT, error) {
172172// UnmarshalBinary sets the values retrieved from byte sequence in a SCCP XUDT.
173173func (x * XUDT ) UnmarshalBinary (b []byte ) error {
174174 l := len (b )
175- if l <= 5 { // where CdPA starts
175+ if l <= 5 {
176176 return io .ErrUnexpectedEOF
177177 }
178178
@@ -194,37 +194,50 @@ func (x *XUDT) UnmarshalBinary(b []byte) error {
194194 offset += n
195195
196196 x .ptr1 = b [offset ]
197- if l < int (x .ptr1 ) {
197+ offsetPtr1 := 3 + int (x .ptr1 )
198+ if l < offsetPtr1 + 1 { // where CdPA starts
198199 return io .ErrUnexpectedEOF
199200 }
200201 x .ptr2 = b [offset + 1 ]
201- if l < int (x .ptr2 + 4 ) { // where CgPA starts
202+ offsetPtr2 := 4 + int (x .ptr2 )
203+ if l < offsetPtr2 + 1 { // where CgPA starts
202204 return io .ErrUnexpectedEOF
203205 }
204206 x .ptr3 = b [offset + 2 ]
205- if l < int (x .ptr3 + 5 ) { // where Data starts
207+ offsetPtr3 := 5 + int (x .ptr3 )
208+ if l < offsetPtr3 + 1 { // where Data starts
206209 return io .ErrUnexpectedEOF
207210 }
208211 x .ptr4 = b [offset + 3 ]
209- if m := int (x .ptr4 ); (m != 0 ) && l < m + 7 { // where optional parameters start
212+ offsetPtr4 := 6 + int (x .ptr4 ) // Optional params have a parameter name preceding its length and value, so we cannot take the first byte as a length
213+ if m := offsetPtr4 ; (m != 0 ) && l < m + 1 { // where optional parameters start
210214 return io .ErrUnexpectedEOF
211215 }
212216
213- offset += 4
214- cdpaEnd := int (x .ptr2 + 4 )
215- cgpaEnd := int (x .ptr3 + 5 )
216- dataEnd := int (x .ptr4 + 6 )
217- x .CalledPartyAddress , _ , err = params .ParseCalledPartyAddress (b [offset :cdpaEnd ])
217+ cdpaEnd := offsetPtr1 + int (b [offsetPtr1 ]) + 1 // +1 is the data length included from the beginning
218+ if l < cdpaEnd { // where CdPA ends
219+ return io .ErrUnexpectedEOF
220+ }
221+ cgpaEnd := offsetPtr2 + int (b [offsetPtr2 ]) + 1
222+ if l < cgpaEnd { // where CgPA ends
223+ return io .ErrUnexpectedEOF
224+ }
225+ dataEnd := offsetPtr3 + int (b [offsetPtr3 ]) + 1
226+ if l < dataEnd { // where Data ends
227+ return io .ErrUnexpectedEOF
228+ }
229+
230+ x .CalledPartyAddress , _ , err = params .ParseCalledPartyAddress (b [offsetPtr1 :cdpaEnd ])
218231 if err != nil {
219232 return err
220233 }
221234
222- x .CallingPartyAddress , _ , err = params .ParseCallingPartyAddress (b [cdpaEnd :cgpaEnd ])
235+ x .CallingPartyAddress , _ , err = params .ParseCallingPartyAddress (b [offsetPtr2 :cgpaEnd ])
223236 if err != nil {
224237 return err
225238 }
226239
227- x .Data , _ , err = params .ParseData (b [cgpaEnd : ])
240+ x .Data , _ , err = params .ParseData (b [offsetPtr3 : dataEnd ])
228241 if err != nil {
229242 return err
230243 }
@@ -233,7 +246,7 @@ func (x *XUDT) UnmarshalBinary(b []byte) error {
233246 return nil
234247 }
235248
236- opts , _ , err := params .ParseOptionalParameters (b [dataEnd :])
249+ opts , _ , err := params .ParseOptionalParameters (b [offsetPtr4 :])
237250 if err != nil {
238251 return err
239252 }
0 commit comments