diff options
| author | Denys Fedoryshchenko <denys.f@collabora.com> | 2025-12-11 00:59:51 +0200 |
|---|---|---|
| committer | Denys Fedoryshchenko <denys.f@collabora.com> | 2025-12-11 01:01:05 +0200 |
| commit | 6fbb4a900c17c28ecf2f6d0b620cfffe5bdd6b39 (patch) | |
| tree | 11e9ef4cf04b267814100bf47e5291657e627c6f /accel-pppd/ctrl | |
| parent | 0a89d44ce83738f3253709eb1d450cc25c80943e (diff) | |
| download | accel-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.c | 6 |
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) |
