gtpie_gettlv(): fix return value on specific error.
Make gtpie_gettlv() return an error if gtpie_getie() returned an error. Previously, openggsn would fail to complain about certain missing elements. Technically, a missing IE could be detectable from the *length value, but the code in gtp.c relies on the return value to detect missing elements, which did not work prior to this commit. For example: if (gtpie_gettlv(ie, GTPIE_EUA, 0, &pdp->eua.l, &pdp->eua.v, sizeof(pdp->eua.v))) { gsn->missing++; GTP_LOGPKG(LOGL_ERROR, peer, pack, len, "Missing mandatory information field\n"); return gtp_create_pdp_resp(gsn, version, pdp, GTPCAUSE_MAN_IE_MISSING); } If an EUA were missing in this code path, openggsn would fail to issue an error message. Since pdp and hence pdp->eua.l is initialized as all-zero, it would probably not do much harm besides failing to issue an error. I haven't checked all callers though.
This commit is contained in:
parent
9684894586
commit
dce814f71c
15
gtp/gtpie.c
15
gtp/gtpie.c
|
@ -135,13 +135,14 @@ int gtpie_gettlv(union gtpie_member *ie[], int type, int instance,
|
|||
{
|
||||
int ien;
|
||||
ien = gtpie_getie(ie, type, instance);
|
||||
if (ien >= 0) {
|
||||
*length = ntoh16(ie[ien]->tlv.l);
|
||||
if (*length <= size)
|
||||
memcpy(dst, ie[ien]->tlv.v, *length);
|
||||
else
|
||||
return EOF;
|
||||
}
|
||||
if (ien < 0)
|
||||
return EOF;
|
||||
|
||||
*length = ntoh16(ie[ien]->tlv.l);
|
||||
if (*length > size)
|
||||
return EOF;
|
||||
|
||||
memcpy(dst, ie[ien]->tlv.v, *length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Reference in New Issue