9
0
Fork 0

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:
Neels Hofmeyr 2015-10-19 13:07:40 +02:00
parent 9684894586
commit dce814f71c
1 changed files with 8 additions and 7 deletions

View File

@ -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;
}