<feed xmlns='http://www.w3.org/2005/Atom'>
<title>accel-ppp.git/accel-pppd/ctrl/ipoe/ipoe.c, 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-09-01T05:55:54+00:00</updated>
<entry>
<title>ipoe: harden DHCPv4 option decoding</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:49:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=3bbf61a373290d63382a4d1bfa8712566eb31c7b'/>
<id>urn:sha1:3bbf61a373290d63382a4d1bfa8712566eb31c7b</id>
<content type='text'>
Validate known options before extracting fields, bound Relay-Agent and classless-route subformats, and replace unaligned DHCP option accesses in notification, relay, and session paths.
</content>
</entry>
<entry>
<title>ipoe: harden local-net prefix length parsing</title>
<updated>2026-08-10T05:55:22+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-08-10T05:55:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=3aa2a84122a48e28aef252b8777d5e57f28fafe5'/>
<id>urn:sha1:3aa2a84122a48e28aef252b8777d5e57f28fafe5</id>
<content type='text'>
The netmask was built by shifting ~0, which is a signed int holding -1,
and left shifting a negative value is undefined in C. Every compiler we
build with produces the expected mask, so this is not a behaviour fix,
but it trips -fsanitize=shift and relies on latitude the standard does
not grant. Shift an unsigned operand instead.

The prefix length itself was not validated properly either. strtoul()
accepts a leading minus and negates, so 'local-net=10.0.0.0/-1' yields
ULONG_MAX, which truncates to -1 in the int and passes the 'mask &gt; 32'
test. The shift count then becomes 33, which is out of range whether the
operand is signed or unsigned. endptr was set but never looked at, so
trailing garbage was silently ignored and '/abc' quietly became a /0.

Keep the parsed value unsigned, reject anything that is not a complete
number in 0..32, and only then narrow it.
</content>
</entry>
<entry>
<title>ipoe: fix username string leak on early session teardown</title>
<updated>2026-07-06T22:15:06+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-07-06T22:13:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=e12b38501be622c9c8e030de86a28721d797e542'/>
<id>urn:sha1:e12b38501be622c9c8e030de86a28721d797e542</id>
<content type='text'>
The ipoe-level ses-&gt;username always holds an allocated string
(_strdup of ifname/calling-station-id, u_inet_ntoa buffer or lua
result), but ipoe_session_free() never released it. Ownership is
normally transferred in auth_result() via ap_session_set_username(),
so the string was leaked whenever a session died before auth_result()
ran: termination while starting, PWDB_WAIT never completing, or
ipoe_create_interface() failure.

The create-interface failure path also leaked the freshly allocated
local copy outright, since it returned before the string was stored
anywhere.

Store the string in ses-&gt;username as soon as it is obtained and free
it in ipoe_session_free(). auth_result() clears ses-&gt;username before
handing ownership to ap_session_set_username(), so no double free is
possible.

Reported-by: Louis Scalbert (#101)
</content>
</entry>
<entry>
<title>ipoe: fix dhcpv4 relay reply packet leak</title>
<updated>2026-07-06T22:15:06+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-07-06T22:12:45+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=7a7ab323158a63f222698f85179090e3b6030b96'/>
<id>urn:sha1:7a7ab323158a63f222698f85179090e3b6030b96</id>
<content type='text'>
dhcpv4_relay_read() takes a reference on the reply packet for every
registered listener context and hands it over via triton_context_call().
The receiving ipoe_ses_recv_dhcpv4_relay() consumes that reference by
storing the packet in ses-&gt;dhcpv4_relay_reply, but the early-return
branch taken when the original request is already gone dropped the
reference without freeing the packet.

This leaks one packet every time a relay reply races with the request
being released, which happens regularly on busy relay-mode deployments.

Reported-by: Louis Scalbert (#101)
</content>
</entry>
<entry>
<title>strip: Fix invalid parsing</title>
<updated>2026-05-21T12:50:42+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-05-21T12:50:42+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=1b67ba0785a847eee6adb69b7e68995c33803805'/>
<id>urn:sha1:1b67ba0785a847eee6adb69b7e68995c33803805</id>
<content type='text'>
strip() memmove count was one short, dropping the NULL  terminator;
dpado_parse error path leaked already-parsed range entries.
Also affects ipoe.

Since strip is identical in both, we can place fixed common function in utils.

Reported-by: Khedor &lt;khedor@gmail.com&gt;
Signed-off-by: Denys Fedoryshchenko &lt;denys.f@collabora.com&gt;
</content>
</entry>
<entry>
<title>session: encapsulate statistics counters</title>
<updated>2026-05-04T00:09:49+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-04-29T12:21:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=d6383d69813cf2244f31d8116176733ffbbeaceb'/>
<id>urn:sha1:d6383d69813cf2244f31d8116176733ffbbeaceb</id>
<content type='text'>
Group the core session starting, active, and finishing statistics behind the private ap_session_stat storage in session.c instead of exposing writable counters through ap_session.h. This keeps ownership inside the session core while preserving the existing CLI and ACCEL-PPP-MIB counter semantics.

Route session counter updates through ap_session_stat_*() helpers. Session start, activation, termination, finish, and shutdown-idle paths no longer open-code individual counter increments/decrements; the update policy now lives beside the session-owned storage and uses relaxed atomic operations for the simple state counters.

Make the CLI show-stat path render from a local snapshot and convert the PPP SNMP starting/active/finishing scalars from watched raw pointers to scalar handlers. PPP controllers now read max-session limits through ap_session_stat_starting() and ap_session_stat_active(), removing external direct access to ap_session_stat.

Signed-off-by: Denys Fedoryshchenko &lt;denys.f@collabora.com&gt;
</content>
</entry>
<entry>
<title>ipoe: encapsulate statistics counters</title>
<updated>2026-05-04T00:09:49+00:00</updated>
<author>
<name>Denys Fedoryshchenko</name>
<email>denys.f@collabora.com</email>
</author>
<published>2026-04-29T11:28:00+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=770550921ae2d084168cb0b9d8d66f783cbdb69d'/>
<id>urn:sha1:770550921ae2d084168cb0b9d8d66f783cbdb69d</id>
<content type='text'>
Group the IPOE starting, active, and delayed offer statistics in struct ipoe_stat_t and keep the storage private to ipoe.c instead of exposing writable stat_* globals. This keeps ownership inside the IPOE control code while preserving the existing CLI and ACCEL-PPP-MIB counter semantics.

Route counter updates through ipoe_stat_*() helpers. Session setup, activation, teardown, and delayed offer queue paths no longer open-code individual counter increments/decrements; the update policy now lives beside the IPOE-owned storage and uses relaxed atomic operations for the simple state counters.

Make the CLI show-stat path render from a local snapshot and convert the IPOE SNMP starting/active scalars from watched raw pointers to scalar handlers. SNMP now reads through ipoe_stat_starting() and ipoe_stat_active(), removing the old ipoe_get_stat() pointer escape hatch.

Signed-off-by: Denys Fedoryshchenko &lt;denys.f@collabora.com&gt;
</content>
</entry>
<entry>
<title>Update header includes in ipoe.c</title>
<updated>2026-02-22T20:45:20+00:00</updated>
<author>
<name>marekm72</name>
<email>35698605+marekm72@users.noreply.github.com</email>
</author>
<published>2026-02-22T20:45:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=29329d1fd11bb7d4bbde8b926b3f633387c7bcad'/>
<id>urn:sha1:29329d1fd11bb7d4bbde8b926b3f633387c7bcad</id>
<content type='text'>
Replaced Linux-specific headers with their net counterparts.</content>
</entry>
<entry>
<title>netlink: Added VRF support</title>
<updated>2026-01-30T03:25:54+00:00</updated>
<author>
<name>Andrii Melnychenko</name>
<email>a.melnychenko@vyos.io</email>
</author>
<published>2026-01-07T12:14:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=d4f230af1cc31447289a7e30640a471a818cfd69'/>
<id>urn:sha1:d4f230af1cc31447289a7e30640a471a818cfd69</id>
<content type='text'>
Added VRF support to the iproute routines.
Updated iproute* calls in the ipoe, radius, and dhcpv6 code.

Signed-off-by: Andrii Melnychenko &lt;a.melnychenko@vyos.io&gt;
</content>
</entry>
<entry>
<title>ci: add tests execution with asan and ubsan</title>
<updated>2025-08-19T18:59:40+00:00</updated>
<author>
<name>Sergey V. Lobanov</name>
<email>sergey@lobanov.in</email>
</author>
<published>2025-08-19T12:39:40+00:00</published>
<link rel='alternate' type='text/html' href='https://git.amelek.net/accel-ppp/accel-ppp.git/commit/?id=c1529bcf0f788ee61097a818fff3a8e27d473e61'/>
<id>urn:sha1:c1529bcf0f788ee61097a818fff3a8e27d473e61</id>
<content type='text'>
</content>
</entry>
</feed>
