<feed xmlns='http://www.w3.org/2005/Atom'>
<title>procd/jail, branch master</title>
<subtitle>OpenWrt service / process manager</subtitle>
<id>https://git.openwrt.org/project/procd/atom?h=master</id>
<link rel='self' href='https://git.openwrt.org/project/procd/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/'/>
<updated>2026-10-21T11:52:36Z</updated>
<entry>
<title>jail: support linux.resources.hugepageLimits</title>
<updated>2026-10-21T11:52:36Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-21T11:52:36Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=7998efd03fb20aa38ab9061fbd9803d35250c463'/>
<id>urn:sha1:7998efd03fb20aa38ab9061fbd9803d35250c463</id>
<content type='text'>
ujail refuses every OCI spec carrying hugepageLimits, although the
cgroup v2 hugetlb controller provides the limits as
hugetlb.&lt;pagesize&gt;.max and the subtree control computation already
enables the controller for hugetlb keys. Write each limit to that file.
OCI and the kernel name page sizes alike (64KB, 2MB, 1GB); a size the
kernel does not offer has no such file and fails the container like
any other limit the host cannot apply.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>jail/seccomp: resolve syscalls by all their header names</title>
<updated>2026-10-20T17:47:29Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-20T17:47:23Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=08cd062e9d48918d78f4a2330f3207ecddb89c47'/>
<id>urn:sha1:08cd062e9d48918d78f4a2330f3207ecddb89c47</id>
<content type='text'>
find_syscall() looks a name up in the table indexed by syscall number,
which holds one name per number. musl renames the 32-bit time syscalls
on 32-bit targets (__NR_clock_gettime32 for the kernel's clock_gettime),
so a seccomp profile allowing clock_gettime or timer_settime resolves
to nothing and the syscall stays denied: the Go runtime's clock fails
in such a jail on i386 and MIPS and the scheduler aborts. Look names up
in a separate table built from both the libc and the kernel headers.

Fixes: dfcfcca7baf2 ("add initial version of ujail and utrace")
Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>jail/seccomp: honour the MIPS ISA bit of code addresses</title>
<updated>2026-10-20T16:26:47Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-20T15:41:23Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=244c55f747b71b34c52f3d24c4294457c46cfee4'/>
<id>urn:sha1:244c55f747b71b34c52f3d24c4294457c46cfee4</id>
<content type='text'>
OpenWrt builds MIPS packages as MIPS16 by default, so main() of a
jailed binary has bit 0 set. seccomp-inject then pokes a classic
break into the middle of the compressed code at that odd address
and the workload dies with SIGSEGV before main, so every jail with
a seccomp profile fails on MIPS, and the trace-mode breakpoints
break the same way. Place breakpoints at the even address with the
16-bit MIPS16e or microMIPS break that AT_HWCAP selects, keep the
ISA bit in the resumed PC and run the injected classic syscall at
the even address.

Fixes: f15d0c407c09 ("jail: apply OCI seccomp filters via ptrace syscall injection")
Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>jail: keep signals pending until ujail can forward them</title>
<updated>2026-10-18T12:03:43Z</updated>
<author>
<name>John Crispin</name>
</author>
<published>2026-10-11T14:52:14Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=4734b86daa33d45996f22487a7aef7632f7bbf33'/>
<id>urn:sha1:4734b86daa33d45996f22487a7aef7632f7bbf33</id>
<content type='text'>
procd resets the signal handlers of a new instance and unblocks its
signals right after fork(). A jailed instance is ujail, which installs
its forwarding handlers only late in main(). A signal that arrives in
between, from the cgroup set-up to the end of the ujail option scan,
uses the default action and kills ujail.

odhcpd-update sends SIGHUP to all dnsmasq instances on each lease
change, which happens while dnsmasq restarts. Each restart lost all
three dnsmasq instances this way, and procd reported a crash for each.

Keep the procd signal set blocked across exec for a jailed instance.
ujail unblocks it after it installs its handlers, so a pending signal
goes to jail_handle_signal(). Before the jail runs, the handler drops a
reload signal and records a stop request.

Signed-off-by: John Crispin &lt;john@phrozen.org&gt;
</content>
</entry>
<entry>
<title>uxc-net: join a bridge through the device bridge options</title>
<updated>2026-10-18T11:31:24Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-15T17:04:01Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=0c4f3c6b32d61db85169f9be317502565053cfe8'/>
<id>urn:sha1:0c4f3c6b32d61db85169f9be317502565053cfe8</id>
<content type='text'>
netifd adds a device to a bridge it does not own through the bridge and
bridge_vlan options of the device itself, read from procd device data.
uxc-net publishes the host end of a bridged container's veth as a
separate bridge-port entry, which netifd does not read, so the veth
never joins the bridge of the attach network.

Set bridge and bridge_vlan on the published veth device and drop the
bridge-port data. bridge_vlan follows netifd's hotplug vlan syntax: the
attach network's own VLAN becomes "&lt;vid&gt;:u", the untagged PVID member,
and each org.openwrt.network.vlans entry "&lt;vid&gt;:t" becomes "&lt;vid&gt;", a
tagged member. An untagged entry is refused, as the syntax ties untagged
to the PVID and a port has one PVID.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>uxc-net: take ingress entries in the podman port order</title>
<updated>2026-10-18T11:31:24Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-15T16:07:36Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=62a6dd9af45793966e398f86ebe6e2ebbbac3e2e'/>
<id>urn:sha1:62a6dd9af45793966e398f86ebe6e2ebbbac3e2e</id>
<content type='text'>
An ingress entry names one port, which is both the external port and
the port inside the container, so a container service cannot be
published on a different external port.

Accept &lt;zone&gt;:&lt;ext&gt;[:&lt;int&gt;][/&lt;proto&gt;], the order podman -p and compose
use, with tcp as the default protocol, and set the redirect's dest_port
to &lt;int&gt;. A port range is only accepted untranslated, as the DNAT
keeps an external port only when it lies in the target range and does
not shift a range. The &lt;zone&gt;:&lt;proto&gt;/&lt;port&gt; form sealed into existing
images keeps its meaning.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>jail, uxc: keep the OCI creation time on the uptime clock</title>
<updated>2026-10-18T11:25:50Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-15T12:24:29Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=006af70b96bb7c1f790339e29e52e031c4638235'/>
<id>urn:sha1:006af70b96bb7c1f790339e29e52e031c4638235</id>
<content type='text'>
ujail reports the created time of the OCI state as an RFC 3339 string of
the wall-clock at create, which is wrong on a device that creates its
containers before NTP has corrected the clock of a missing or
battery-less RTC, and stays wrong afterwards.

Report created in seconds of uptime, the value the instance events
already carry, and let uxc turn it into an RFC 3339 UTC time with
calendar_format() when it prints uxc state or uxc list, so the shown
time follows the wall-clock in effect at output.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>jail: report state changes to procd on a status socket</title>
<updated>2026-10-18T11:25:50Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-15T11:28:46Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=b9b0e3a192c3276c0d3d932f76061e3d50c6077b'/>
<id>urn:sha1:b9b0e3a192c3276c0d3d932f76061e3d50c6077b</id>
<content type='text'>
procd only learns that the process it started for a container exited,
and ujail stays alive in the stopped state until the container is
deleted, so procd can tell neither whether the container was created
and its payload started nor that the payload died.

When descriptor 3 is a socket at startup, take it as the status socket
procd hands over, mark it close-on-exec so that hooks and the payload
never inherit it, and keep it across the restart re-execution. Each
instance.ready, instance.running and stop or create failure is sent as
one struct jail_status record of type, flags (reaped, started,
requested, escalated, restarting, registered), exit status and payload
runtime in seconds, defined in jail-status.h for both sides. A send
uses MSG_NOSIGNAL, so a peer that has gone away cannot kill ujail.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>jail: apply a resources override at create</title>
<updated>2026-10-18T11:25:50Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-15T07:55:43Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=5beb80f00751b64654a52934f85ac30754df744a'/>
<id>urn:sha1:5beb80f00751b64654a52934f85ac30754df744a</id>
<content type='text'>
Limits that differ from the bundle's linux.resources can only be set
with container.&lt;name&gt;.update once the container exists, so a container
started immediately runs its payload under the bundle's limits until
the update lands, and a container that re-executes itself after a
netifd restart comes back without the update at all.

Take an override file with -W, holding linux.resources members, and
apply it right after the bundle is parsed, through the same ceiling
check the update method uses, so the values are written when the
cgroup is set up and before the payload runs. A missing file means no
override, so the path can be passed before an override exists, and
since the option is part of the saved argv, a re-execution reads the
file again and follows later changes to it. An override the ceiling
refuses leaves the bundle's limits in place, is logged, and is reported
in instance.ready as resources_refused and resources_errno.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
<entry>
<title>jail: let the env file override the bundle environment</title>
<updated>2026-10-18T11:25:50Z</updated>
<author>
<name>Daniel Golle</name>
</author>
<published>2026-10-15T07:41:42Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/procd/commit/?id=257cb785c010b69ee9ca8e30e541fbefd9c4ef02'/>
<id>urn:sha1:257cb785c010b69ee9ca8e30e541fbefd9c4ef02</id>
<content type='text'>
append_envfile() appends every line of the env file after the bundle's
process.env and keeps duplicates. getenv() returns the first match, so
a variable the image already sets cannot be changed through the env
file, and an operator or stack value for it is silently ignored.

Let a line from the env file replace an entry of the same name.
The env file then overrides the image environment, as an environment
given to docker run or podman run does. Engines that pass the final
environment in config.json use no env file and are not affected.

Signed-off-by: Daniel Golle &lt;daniel@makrotopia.org&gt;
</content>
</entry>
</feed>
