summaryrefslogtreecommitdiff
path: root/accel-pppd/ctrl
diff options
context:
space:
mode:
authorDenys Fedoryshchenko <denys.f@collabora.com>2025-12-11 00:59:51 +0200
committerDenys Fedoryshchenko <denys.f@collabora.com>2025-12-11 01:01:05 +0200
commit6fbb4a900c17c28ecf2f6d0b620cfffe5bdd6b39 (patch)
tree11e9ef4cf04b267814100bf47e5291657e627c6f /accel-pppd/ctrl
parent0a89d44ce83738f3253709eb1d450cc25c80943e (diff)
downloadaccel-ppp-6fbb4a900c17c28ecf2f6d0b620cfffe5bdd6b39.tar.gz
accel-ppp-6fbb4a900c17c28ecf2f6d0b620cfffe5bdd6b39.zip
pppoe: Fix RFC2516 non-compilance in PADI tags parsing
We currently only break out of the switch, so the for loop keeps parsing tags after TAG_END_OF_LIST (accel-pppd/ctrl/pppoe/pppoe.c: around pppoe_recv_PADI). RFC 2516 (paragraph 5, Tag Types: End-of-List) says an End-of-List tag MAY appear in PADI/PADR and "any TAGs after an End-of-List MUST be ignored." Since we continue processing them, this behavior is technically non-compliant with the RFC. Same in pppoe_recv_PADR. Signed-off-by: Denys Fedoryshchenko <denys.f@collabora.com>
Diffstat (limited to 'accel-pppd/ctrl')
-rw-r--r--accel-pppd/ctrl/pppoe/pppoe.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/accel-pppd/ctrl/pppoe/pppoe.c b/accel-pppd/ctrl/pppoe/pppoe.c
index 93412b95..dfc79834 100644
--- a/accel-pppd/ctrl/pppoe/pppoe.c
+++ b/accel-pppd/ctrl/pppoe/pppoe.c
@@ -1017,7 +1017,7 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
return;
switch (ntohs(tag->tag_type)) {
case TAG_END_OF_LIST:
- break;
+ goto tags_done;
case TAG_SERVICE_NAME:
if (tag->tag_len == 0 && conf_accept_blank_service) {
service_match = 1;
@@ -1048,6 +1048,7 @@ static void pppoe_recv_PADI(struct pppoe_serv_t *serv, uint8_t *pack, int size)
break;
}
}
+tags_done:
if (conf_verbose)
print_packet(serv->ifname, "recv", pack);
@@ -1159,7 +1160,7 @@ static void pppoe_recv_PADR(struct pppoe_serv_t *serv, uint8_t *pack, int size)
}
switch (ntohs(tag->tag_type)) {
case TAG_END_OF_LIST:
- break;
+ goto padr_tags_done;
case TAG_SERVICE_NAME:
service_name_tag = tag;
if (tag->tag_len == 0)
@@ -1201,6 +1202,7 @@ static void pppoe_recv_PADR(struct pppoe_serv_t *serv, uint8_t *pack, int size)
break;
}
}
+padr_tags_done:
if (!ac_cookie_tag) {
if (conf_verbose)