<feed xmlns='http://www.w3.org/2005/Atom'>
<title>accel-ppp.git/accel-pppd/ipv6, branch 1.15.0</title>
<subtitle>High performance PPTP/L2TP/SSTP/PPPoE/IPoE server for Linux (mirror of https://github.com/accel-ppp/accel-ppp.git)
</subtitle>
<id>https://git.amelek.net/accel-ppp/accel-ppp.git/atom?h=1.15.0</id>
<link rel='self' href='https://git.amelek.net/accel-ppp/accel-ppp.git/atom?h=1.15.0'/>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/'/>
<updated>2026-10-05T23:19:48+00:00</updated>
<entry>
<title>ipv6: remove obsolete three-server DNS limit</title>
<updated>2026-10-05T23:19:48+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-08-27T06:16:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=2823a07df0c88e9d98472b9248f2e9c3179f6920'/>
<id>urn:sha1:2823a07df0c88e9d98472b9248f2e9c3179f6920</id>
<content type='text'>
The legacy limit matches RFC 6106's recommendation that hosts treat three learned RDNSS addresses as sufficient. That was host-side repository guidance, not a limit in the RADIUS, DHCPv6, or RDNSS encodings.

RFC 8106 obsoletes RFC 6106 and explicitly removes the recommendation to limit learned RDNSS addresses to three, leaving the number to local policy. It instead recommends the ability to store at least three addresses when DNS information comes from multiple sources.

Store both configured and per-session servers in reusable contiguous arrays. Start with a four-address, 64-byte allocation, grow geometrically, retain capacity across reload or reauthorization, and free session storage only at teardown. Bound advertised lists by actual DHCPv6 and router-advertisement packet space.

Warn when servers have to be dropped for lack of room, as the fixed limit used to, skip the DNS search list rather than write it past the end of a full advertisement, and drop the stale three-server wording from the [ipv6-dns] documentation.

Link: https://github.com/accel-ppp/accel-ppp/commit/4f562467dbdf819395e138617c2a057e02595b9e#r197212083
Link: https://www.rfc-editor.org/rfc/rfc6106.html#section-5.3.1
Link: https://www.rfc-editor.org/rfc/rfc8106.html#section-5.3.1
Link: https://www.rfc-editor.org/rfc/rfc8106.html#appendix-A
</content>
</entry>
<entry>
<title>ipv6: use a dedicated type for per-session DNS</title>
<updated>2026-10-05T23:18:41+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-08-27T06:14:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=d8084108cc750962dafcd3716f5d243de2e56418'/>
<id>urn:sha1:d8084108cc750962dafcd3716f5d243de2e56418</id>
<content type='text'>
DNS-Server-IPv6-Address carries a full IPv6 address, so storing it in
ipv6db_addr_t also carried an unused prefix length and flags. Introduce
dedicated DNS list and address types so the representation matches the data.

Suggested-by: Vladislav Grishenko &lt;566150+themiron@users.noreply.github.com&gt;
Link: https://github.com/accel-ppp/accel-ppp/commit/4f562467dbdf819395e138617c2a057e02595b9e#r197215804
</content>
</entry>
<entry>
<title>ipv6_nd: do not overrun the advertisement buffer with prefix information</title>
<updated>2026-10-05T23:18:41+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-08-27T10:34:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=2600050acd74bf6cea320e8d5f3c7ae09568b062'/>
<id>urn:sha1:2600050acd74bf6cea320e8d5f3c7ae09568b062</id>
<content type='text'>
The prefix information options are written into a fixed 1024 byte pool
buffer with no bound at all, one 32 byte option per address on the
session. A session carrying more than about thirty addresses therefore
writes past the end of the buffer.

Skip the prefix information of the addresses which no longer fit and warn
about them. The loop also installs the addresses on the interface, so keep
doing that regardless of how much room is left in the advertisement.
</content>
</entry>
<entry>
<title>dhcpv6: reject malformed options and bound relay replies</title>
<updated>2026-09-07T19:08:04+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-09-07T19:08:04+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=0648072b19b509fa4ca90664344371d1cfa01935'/>
<id>urn:sha1:0648072b19b509fa4ca90664344371d1cfa01935</id>
<content type='text'>
Reject duplicate Rapid-Commit/AFTR options, validate AFTR labels, and
limit relay nesting. Measure reply space from the allocation, propagate
allocation failure through reply builders, and encode relay lengths correctly.

Adapted from Ritika Chopra's accel-ppp-ng PR #40, T8473/T8474/T8475.
Upstream already has the status, AFTR-printing and inner relay bounds fixes.

Co-authored-by: Ritika Chopra &lt;r.chopra@vyos.io&gt;
</content>
</entry>
<entry>
<title>utils: centralize unaligned integer accessors</title>
<updated>2026-09-01T06:08:47+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-09-01T06:08:47+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=7d4f8524f57ba0ac77e47171bebfc0370df667b1'/>
<id>urn:sha1:7d4f8524f57ba0ac77e47171bebfc0370df667b1</id>
<content type='text'>
</content>
</entry>
<entry>
<title>dhcpv6: validate option and relay boundaries</title>
<updated>2026-09-01T05:55:54+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-09-01T05:47:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=94993558dab2b79107c1d67c5cdb081604dada71'/>
<id>urn:sha1:94993558dab2b79107c1d67c5cdb081604dada71</id>
<content type='text'>
Enforce fixed option prefixes centrally, bound nested relay messages to their declared payload, require one valid Relay-Message, and decode ORO and diagnostic fields without unaligned or oversized reads.
</content>
</entry>
<entry>
<title>Merge pull request #351 from nuclearcat/various-fixes-on-compiler-warnings</title>
<updated>2026-09-01T05:52:55+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-09-01T05:52:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=57ae56148c5519b9207ede623098d3cfad5211b8'/>
<id>urn:sha1:57ae56148c5519b9207ede623098d3cfad5211b8</id>
<content type='text'>
Various fixes on compiler warnings</content>
</entry>
<entry>
<title>ipv6: assign DNS servers per session from RADIUS</title>
<updated>2026-08-12T07:42:35+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-08-04T15:39:51+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=58ef850d1705d88f006d761d32c55bde5205a27d'/>
<id>urn:sha1:58ef850d1705d88f006d761d32c55bde5205a27d</id>
<content type='text'>
The ipv6_nd and ipv6_dhcp modules could only advertise the DNS servers
configured in [ipv6-dns], the same set for every subscriber. RFC 6911
defines DNS-Server-IPv6-Address (attribute 169) for exactly this, and
the attribute was already in the shipped dictionary and in attr_defs.h;
nothing read it.

Give struct ap_session an ipv6_dns list, filled by the radius module
from that attribute, and have both modules advertise it when the session
has one: in the RDNSS option of the router advertisements, and in the
DNS_SERVERS option of DHCPv6 replies. Sessions without a list of their
own keep getting the configured servers, so nothing changes for anyone
not sending the attribute.

The selection is a single ipv6_dns_get() shared by both modules rather
than a copy in each: they already duplicate the whole [ipv6-dns] parser,
and two copies of a precedence rule are two chances to drift. It caps
what it returns, so neither the RDNSS option length (one byte, in units
of 8) nor the router advertisement buffer can be pushed around by what a
RADIUS server sends. The radius module caps at the same 3 servers as
[ipv6-dns] accepts and warns once when a reply carries more.

An Access-Accept which carries the attribute replaces the whole
previously assigned list rather than appending to it, so a re-authorized
session ends up with the servers of the latest reply and not with a
concatenation. One which does not carry it leaves the current list
alone, which is how the IPv4 MS-Primary-DNS-Server attribute already
behaves.

ipv6_dns_test.c covers the selection: assigned wins over configured,
empty list means "nothing assigned" rather than "no DNS", the cap holds
for both sources, and a caller with no room gets nothing rather than a
stomped buffer. Wired into the ASAN/UBSAN workflow.

Inspired by the per-session IPv6 DNS support in accel-ppp-ng (commit
2df6eb99), reimplemented against mainline's ap_session and ipdb types.
</content>
</entry>
<entry>
<title>dhcpv6: read the elapsed time and preference options at their real width</title>
<updated>2026-08-10T06:43:09+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-08-10T06:43:09+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=7c98f320c3ef7e863a9c7d30bb81735bb4fec46d'/>
<id>urn:sha1:7c98f320c3ef7e863a9c7d30bb81735bb4fec46d</id>
<content type='text'>
print_time() read a 32 bit word out of the Elapsed Time option, which
RFC 8415 21.9 defines as exactly two octets, and clients include it in
almost every message they send. With verbose enabled that is a two byte
read past the option on every DHCPv6 transaction:

  ERROR: AddressSanitizer: heap-buffer-overflow
  READ of size 4 in print_time dhcpv6_packet.c:499

The value was not byte swapped either, so what got logged was not the
elapsed time. Read two octets, convert them, and copy them out rather
than dereferencing a pointer into the packet that need not be aligned.

print_uint8() has the same shape, so check the length there too before
reading the Preference octet.
</content>
</entry>
<entry>
<title>dhcpv6: fix end pointer of an encapsulated relay message</title>
<updated>2026-08-10T06:42:23+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-08-10T06:42:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=b0e7444cfea168b6b283ca89e00b57494e0bced2'/>
<id>urn:sha1:b0e7444cfea168b6b283ca89e00b57494e0bced2</id>
<content type='text'>
opth-&gt;data already points past the option header, so adding
sizeof(*opth) again counted it twice and left endptr four bytes beyond
the end of the Relay-Message option, and possibly beyond the received
packet.

The bounds check at the top of the option loop is written against that
endptr, so on the next pass it accepted an option header that lies
outside the buffer and read opth-&gt;len from it. ASan on a Relay-Forward
packet:

  ERROR: AddressSanitizer: heap-buffer-overflow
  READ of size 2 in dhcpv6_packet_parse dhcpv6_packet.c:158

The end of the relayed message is the option payload, nothing more.
</content>
</entry>
</feed>
