Skip to content

Commit 7588197

Browse files
authored
Merge pull request #32 from gomaja/fix-offset-pointers-udt-xudt
fix: fixes pointer offset as per specification referencing
2 parents f421b06 + 38e8f7a commit 7588197

File tree

2 files changed

+49
-23
lines changed

2 files changed

+49
-23
lines changed

udt.go

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ func ParseUDT(b []byte) (*UDT, error) {
110110
// UnmarshalBinary sets the values retrieved from byte sequence in a SCCP UDT.
111111
func (u *UDT) UnmarshalBinary(b []byte) error {
112112
l := len(b)
113-
if l <= 5 { // where CdPA starts
113+
if l <= 5 {
114114
return io.ErrUnexpectedEOF
115115
}
116116

@@ -125,33 +125,46 @@ func (u *UDT) UnmarshalBinary(b []byte) error {
125125
offset += n
126126

127127
u.ptr1 = b[offset]
128-
if l < int(u.ptr1) {
128+
offsetPtr1 := 2 + int(u.ptr1)
129+
if l < offsetPtr1+1 { // where CdPA starts
129130
return io.ErrUnexpectedEOF
130131
}
131132
u.ptr2 = b[offset+1]
132-
if l < int(u.ptr2+3) { // where CgPA starts
133+
offsetPtr2 := 3 + int(u.ptr2)
134+
if l < offsetPtr2+1 { // where CgPA starts
133135
return io.ErrUnexpectedEOF
134136
}
135137
u.ptr3 = b[offset+2]
136-
if l < int(u.ptr3+5) { // where u.Data starts
138+
offsetPtr3 := 4 + int(u.ptr3)
139+
if l < offsetPtr3+1 { // where u.Data starts
137140
return io.ErrUnexpectedEOF
138141
}
139142

140-
offset += 3
141-
cdpaEnd := int(u.ptr2 + 3)
142-
cgpaEnd := int(u.ptr3 + 4)
143-
u.CalledPartyAddress, _, err = params.ParseCalledPartyAddress(b[offset:cdpaEnd])
143+
cdpaEnd := offsetPtr1 + int(b[offsetPtr1]) + 1 // +1 is the data length included from the beginning
144+
if l < cdpaEnd { // where CdPA ends
145+
return io.ErrUnexpectedEOF
146+
}
147+
cgpaEnd := offsetPtr2 + int(b[offsetPtr2]) + 1
148+
if l < cgpaEnd { // where CgPA ends
149+
return io.ErrUnexpectedEOF
150+
}
151+
dataEnd := offsetPtr3 + int(b[offsetPtr3]) + 1
152+
if l < dataEnd { // where Data ends
153+
return io.ErrUnexpectedEOF
154+
}
155+
156+
u.CalledPartyAddress, _, err = params.ParseCalledPartyAddress(b[offsetPtr1:cdpaEnd])
144157
if err != nil {
145158
return err
146159
}
147160

148-
u.CallingPartyAddress, _, err = params.ParseCallingPartyAddress(b[cdpaEnd:cgpaEnd])
161+
u.CallingPartyAddress, _, err = params.ParseCallingPartyAddress(b[offsetPtr2:cgpaEnd])
149162
if err != nil {
150163
return err
151164
}
152165

153166
u.Data = &params.Data{}
154-
if _, err := u.Data.Read(b[cgpaEnd:]); err != nil {
167+
if _, err := u.Data.Read(b[offsetPtr3:dataEnd]); err != nil {
155168
return err
156169
}
157170

xudt.go

Lines changed: 26 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ func ParseXUDT(b []byte) (*XUDT, error) {
172172
// UnmarshalBinary sets the values retrieved from byte sequence in a SCCP XUDT.
173173
func (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

Comments
 (0)