Commit Graph
1099 Commits
Author SHA1 Message Date
Felix Fietkau a4e922953c ucode: update to Git HEAD (2026-10-18)
f8c2d64f546c uloop: allow reusing the existing environment for a new process
1294001ec6cb uloop: fix array reference
dd91bd8396a5 tests: add test cases for use-after-free gc bugs
d96db3ea5ef2 json: fix use-after-free of read method across iterations
8a74d68a34ab lib: anchor working values in filter/map/callfunc across user code
2225a502e805 socket: anchor poll() result across user fileno() callbacks
6a061cf4ef34 zlib: fix use-after-free of read method across iterations
dbe92bca180b types: free uvcount=0 resources on retain=true sweep
b0574723d27d zlib: zero-fill the output reserve window
cc0698b723ed serial: add module skeleton, build wiring and fd helpers
114ffb8962e2 serial: add raw termios access and termios constants
3bdeeb0b1ef7 serial: add setspeed, setraw and setblocking helpers
2b22a1ac41b0 serial: add modem control line access (out-of-band signals)
bed2a12895ce serial: add break, drain, flush and queue inspection
697fe07b14db serial: add setserial-style serial_struct access (Linux)
504530a290ad serial: add termios round-trip test
d6544940e762 ubus: fix reply leak in deferred data callback
dfca6438bc55 fs: reimplement popen() with fork/exec and true shell-free array support
9a87ce92207a debug: rework memdump to invoke fileno() on resource values
bed321219636 types: expose exception_type_strings array
67b13e97a643 lib: allow die() to re-throw exception objects
f2d62f82a522 lib: deduplicate source files by resolved path in vm->sources cache
255f69081304 socket: add CAN socket support
6adff7054893 rtnl: add CAN link type support
b79e20e1eee5 rtnl: add vxcan link type support
5870b9995ff4 rtnl: zero reserved struct headers in nested attributes
abb80c69ed2d include: add `unused` macro
ff509e0698dc include: register resource type prototypes with VM
c404fe2d6556 types: add per-instance prototype support for extended resources
7fb34544e945 ci: install libffi on test runners
23d5561b04b2 ffi: add LibFFI-based foreign function interface module
f26fabfe3ecb ffi: Add .cast(), .copy(), .string() as ctype instance methods
19ffa8aa3218 vm: release resource type prototypes before the final GC
48e38fc6376f tests: move ffi ctype instance method tests to proper place
4d687afdc216 compiler, vm: implement tail call optimization
7074129727d9 vm: indicate tail call optimized frames in stack traces
c3dc162f0abc lib: reject circular prototype chains in proto()
fe9e2947d351 compiler: reject adjacent template literals
e9972df30d14 linux/types.h: add 128-bit integer types
76baa6fc264a types: fix instance-proto lookup offset in ucv_key_get()
fbdd169efd17 ubus: store per-call request proto in the instance proto slot
0aab97337e21 ubus: drop per-instance proto when releasing resources
4eff16514b57 uloop: report signal termination in process callbacks
9ba6ea147dee headers: split public and private API headers
4c6e64425d14 ffi: reject function values passed as variadic arguments
af69c8d226a9 types, vm, lib: add metamethod support for prototyped values
1fd07aa2ba34 ffi: represent wrapped C functions as "ffi.cfn" resources
c966006d635f ffi, vm: support property syntax for cdata via __get__ / __set__
672439e7c530 vm: add debugger infrastructure (breakpoints, offsets, nested-exit fix)
a5b5925b53ab debug: add interactive command line debugger with -x/-X CLI switches
c2476472eb23 debug: add remote debug protocol with a client/server split
d968d33f455e debug: move the debugger onto a line-based protocol, split server/client
1a771e3c1ffd debug: add line editing, EVAL, Ctrl-C interrupt and tail-call annotations
26bfd5851bcc debug: synthesize PAUSED when a resuming command cannot resume
00a8fa9dea6c ffi: add ffi.closure() for explicit C function pointer creation
f061ee2e4369 ffi: fix Clang static analyzer false positives in closure code
8c017f171f0a types: Fix warning unused variable
0273114f13a6 types: raise type error for non-index array property sets in strict mode
d2c7b24e366e struct: rename ucv_as_double to ucv_as_float64
4dd080fe47ab headers: privatize uc_program_entry/ucv_closure_new/ucv_compare, add uc_program_main()
fda0498102bd lib, vm: replace ad-hoc value casts with ucv_as_* macros
ad88dfb621d6 metamethods: object-valued __get__/__set__/__delete__ delegate instead of mis-delegating return values
ea4c65b3c255 lib/fs.c: set errno on failed open()
10e44a53f808 lib.c: add optional offset argument to index() and rindex()
37d10ce70189 lib/io.c: fix io.pipe() jsdoc example
100f354f5d75 lib/math.c: export math constants (PI, E, ...)
ca70f18e31b3 lib/resolv.c: validate retries/timeout and guard retry-interval division
22f64a32f784 treewide: adjust references after jow-/ucode => ucode-lang/ucode move
6373faeac549 docs: fix deep merge example
1561320a00b4 lib,main,types: include json-c compat shim where needed
83ed2a8ba815 tutorials: fix claims that disagree with the interpreter
cef095d846bd Update CNAME
0c39aaa3d277 lib/log.c: accept arrays of channel and option names
ad3a5d580983 lib/log.c: use the documented defaults for omitted arguments
9e1d747640fe devcontainer: add development container configuration
d2c81218773b vm: clear a pending exception when entering uc_vm_execute
deb063dba30d build: add minimal emscripten/wasm32 build guards
75489e3ca2d5 source: initialize runpath in uc_source_new_buffer
4e65efb46854 build: add emscripten/wasm32 CMake support
24b0a2ad2e05 lib: underline the statement an error occurred in
926a2bf7e219 lib: name the offending expression when a call fails
068e7b222b4f ucode: fix socket bind() ignoring port argument
a4da50de2430 io: read the current termios before applying attributes
38f21be1bcbb uloop: redirect the task child's standard descriptors to /dev/null
af8a3830661a uloop: close the task output pipe even without an input callback
e6e03000000f uloop: release the handle when uloop_fd_add() fails
1e6b56558617 uloop: read task messages without losing them to EAGAIN
6e1592a2862f fs: report a write that only fails when the file is closed
d075095287c8 fs: keep the bytes a short read already delivered
8c01857cadd0 resolv: file each NS, CNAME and PTR record under its own type
4fec71ddd26d struct: decode any non-zero byte as true in native mode
edf5b32c5d4c zlib: inflate every member of a concatenated stream
b844c63b2381 resolv: release the TXT buffer when the record is malformed
664b70791957 compiler: unwind the nested function compiler on a bad argument list
ab988ea3159a struct: accumulate signed integers in an unsigned type
d996fade5f36 compiler: do not overflow int building the wildcard import operand
24df8d20bde2 vm: give division by zero the right sign, and NaN for zero over zero
a5c102ea2cfd tests: expect statement underline in forward declaration error
ccbe4228913d types: clear resource value slots after releasing them
c7e550d05ec4 socket: reject recv() lengths that overflow the printbuf offset
b1c7693fc5c6 socket: do not free caller-owned control data in sendmsg()
0630355f1ce6 socket: size msg_controllen from the payload, not the cmsg length
b51836754a9e types: do not dereference tagged values in ucv_string_length()
8fac388410d4 struct: bound the base64 pack field to the space reserved for it
b8a8646cbb2c struct: bounds-check the field offset when unpacking
5544af285082 struct: allocate the string header when packing zero bytes
8bd004a1a423 lib: free the string match() allocated, not the one it advanced
e98574152fcb io: return ENOMEM rather than aborting on an oversized read
9b45eef92402 io: give ioctl() a heap buffer the kernel cannot overrun
531c09289a4f resolv: check the SOA rdata bound after the two names
4d12bc9af856 ubus: detect cycles when converting values to blobmsg
5bcb94aec84d vallist: reject an inline string constant longer than its buffer
cd73805bcb0f program: validate the export name length when loading bytecode
fe546444f289 program: terminate the strings the bytecode loader reads
ba4b639597e6 compiler: do not return a bytecode program that was just freed
19247f51e22a compiler: unwind the patchlist when an expression fails to parse
58774dd67277 rtnl, nl80211: check every netlink reserve return
8fff82c22a7c fs: stop readfile() losing data when the buffer cannot grow
39454f8830a9 zlib: act on the output reserve failing
a90a1d2c9ebe lib: size the b64dec output buffer from the ceiling
ad3be9a33322 ubus: bound the nesting depth when decoding a message
953cd5a9ea23 ubus: do not close a descriptor the script still owns
5a2c5d93ce53 lexer: discard the partial string when an escape is rejected
428232cfce1c vm: range-check local slots, upvalue indices and stack depth
e170905c143b program: bound the counts and lengths the bytecode loader reads
6065b2ce63cc program: bound an export name by the bytes left in the file
e1a8b8cf5d21 compiler: do not call a missing infix handler inside parentheses
2cd8d1b9726b compiler: do not read the last instruction of an empty chunk
468994d345ff compiler: compare local names without assuming they are strings
04d59c6395de compiler: guard the remaining local name comparisons
19656543aac0 types: dispatch __delete__ for keys arrays and resources cannot store
dd57d12404ec compiler: do not drop the loop condition at chunk offset 0
dc9386a190fb jsdoc: accept a doc comment at the very start of a file
04d3ae59abd4 serial: add JSDoc documentation for module functions and constants
959206e27878 netaddr: add new netaddr module ported from LuCI's luci-lib-ip
904358422b3b docs: restructure tutorials around the new manual
af9324c9e7c5 readme: point at the new project sites
212dd12150b6 lib: optimize trim(), ltrim(), rtrim()
2c8c36be454d struct: fix infinite loop in grow_buffer() for small sizes
131c041a61d5 platform: export the macOS pipe2() replacement to modules
e6a1f945db65 fs: find the PATH separator without strchrnul()
4711d3c2c5dc lib: reject mutations of the container being sorted
f0a4664b97b0 rtnl: recover the event listener from receive buffer overruns
eaa09ca64305 rtnl: free the partial reply of a request that fails
5c655c357c53 rtnl: return true for an acknowledgement without data
0bfb7b97bf2f nl80211: recover the event listener from receive buffer overruns
30dfbb218fa1 nl80211: return true for an acknowledgement without data
395cfeead63f nl80211: fail a request whose reply the event socket lost
f8f8fc55126f nl80211: run listener callbacks outside of a request
f60d9b01b59c nl80211: free the partial reply of a request that fails
234e524f7ae0 nl80211.h: update to mainline d24e8ac715de
80be3ab390ee nl80211: request and decode the per-link statistics of a station
c51e15921dc6 lib: fix module namespace export mapping for linked imports
b5ce44358354 compiler: report strict redeclarations at the redeclaring name
e22e4362e6d5 tests: allow restricting a testcase to platforms
ef5b35ea145e tests: do not check forked children with valgrind
a6b8bfe1b582 tests: allow a testcase to skip itself
7fe06b46f3c5 uloop: expose ULOOP_ERROR_CB
115d308a8514 uloop: release timers and handles once they are finished
0c1b005cd0d3 uloop: disarm a timer on set() without a timeout
986390458007 uloop: disarm an interval on set() without a value
503a9bfcffd2 uloop: test that a finished task closes its pipes
f4fa308dc4f2 uloop: keep a task alive while its output callback runs
fa81c11ff2a7 uloop: release a finished task after a callback exception
21a2140f2324 uloop: reject a handle without an IO event
0ea69b1e736a uloop: do not unregister a reused descriptor number on handle delete
ddb06a197ef5 compiler: make strict mode function names constant bindings
620eff6a772d uloop: keep a handle alive while epoll may still report it
1942e5fce058 uloop: disable a handle whose removal fails
9a3acc008531 uloop: expose ULOOP_PRIORITY
1f54bd285339 uloop: read task messages without blocking the event loop
c2319e9b26bb uloop: close the task pipes when fork() fails
db2191ab014e devcontainer: remove formatting options managed by editorconfig
486104700227 compiler: account for nested imports in the importer's export offset
be870dd61b95 types: give the collector a dedicated mark bit
2e0b25a23c09 socket: fall back to SO_TIMESTAMPNS for the OLD alias
4141cb38f398 ubus: pass an exception of a deferred completion callback to the guard
0fcd31713fee ubus: do not pass exit() in a callback to the guard
c80855059801 socket: fix the file descriptor on 64-bit big-endian
a18924e53045 tests: move the socket poll test to the lib_socket directory
f4ce7eb00d22 source: allocate and release a source in one place
8d25f029d96b compiler: give dynamic loads the position of the import
08f3be072dd0 vm: read the callee type before uc_vm_call() runs it
3c9f214a2d56 serial: add RS485 mode access (Linux)
100d19ac369f vm: keep the exception of a module that failed to load
3c0a3c7c1023 vm: read the importing frame after the module load
2cf103aded34 tests: skip the RS485 serial test under valgrind
5c8d6d544730 lib: fix stack use after scope in compile config parsing
0dc042eefa5b source: rework the text access API
1dd1f88c81bb source: close the file of a source after its compilation
69db946e7c39 lib: remove the source cache of loadfile()
4436a931dc38 compiler: start each compilation from a clean source
4503599e49f1 source: read a file that cannot seek into a buffer
330cdab782be compiler: release the name list of an import() statement
153c627fd445 lib: do not store a failed module in the module table
3bf604919140 vm: keep the exception of a failed dynamic module load
71b4a144b438 lib: compile a file loaded from a module body as a program
080cbd79727f lib: release the main function of a required file
6c30ef7fd30c vm: release the previous binding of an import
6e404de5c0b1 vm: let the main closure of a program own its module exports
0adb7ba6b4d1 vm: do not interrupt the exports of a module
8cfcffe5abcd lib: find the exports of a precompiled module by their count
53ebdff102e6 vm: size object literals from the compiler's key count
f8a757295dc9 types: start array entry vectors at 2 slots
00091f829801 types: avoid accessing values after converter exit
78f83f8d6b59 lib: take one reference on the prototype in proto()
96cdb4549b59 compiler: fix endless loop on syntax errors in template placeholders
fb54dfe1733c types: release the old instance prototype of a resource

struct uc_vm grows at its end, and programs such as hostapd embed it, so
bump PKG_ABI_VERSION.

Add packages for the new ffi, netaddr and serial modules. Turn them off
for the host build, since ffi is otherwise built whenever libffi happens
to be in the staging directory.

The project moved to ucode-lang/ucode, so update PKG_SOURCE_URL.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-10-19 12:22:07 +02:00
Felix Fietkau ae9276426c ucode: rtnl: return true on acknowledged requests without data
Fixes error handling issues on requests

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-10-09 20:46:24 +02:00
Felix Fietkau 04d0bbcdc2 provision: add a backend for a GPT partition named provisioning
A device without UBI, such as an x86 VM or a device on eMMC, can keep its
provisioning data on a block partition named `provisioning`. The data
uses the same header as the UBI volume.

open() and create() prefer the UBI volume and then look for the partition
through the PARTNAME of each block device in sysfs. A commit checks the
flush, because close() reports no error. A partition cannot be removed
from here, so destroy erases the header and the data.

The provision command now exits with an error when a commit or a
destroy fails, for both backends.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-10-08 09:50:37 +02:00
Hauke Mehrtens d09134f6ed nvram: bound the variable parser to the nvram partition
The "name=value\0 ... \0\0" walk over the mmap()ed nvram used strchr()
and strlen() without a bound, so an nvram without the terminating
double NUL made it run past the end of the mapping.

Search with memchr() up to the length from the nvram header, or up to
the end of the mapping when that length does not fit, so a broken
header is still readable. A variable that is not terminated in this
area ends the parsing.

Map a regular file, like the /tmp staging file, only as far as it is
backed, rounded down to 4 bytes for the padding in nvram_commit(),
instead of the partition size which raised SIGBUS. Only search the
start of a mapping smaller than NVRAM_MIN_SPACE for the magic instead
of underflowing the loop boundary; bcm47xxpart creates such nvram
partitions on flashes with 4 KiB erase blocks.

"nvram info" clamps the header length before the CRC8, it read beyond
the mapping or underflowed into a 4 GB read before.

This is reachable with a crafted nvram partition or staging file, on
bcm47xx the nvram partition is also parsed while booting.

Reported by @tonoyx91 and @0xROI.

Link: https://github.com/openwrt/openwrt/security/advisories/GHSA-5m25-qmhm-crr4
Fixes: 400c1a7fbf ("Add unvram, a nvram manipulation tool suitable for brcm-2.4 and bcm47xx platforms")
Assisted-by: Claude:claude-opus-5
Link: https://github.com/openwrt/openwrt/pull/25240
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-10-07 02:34:33 +02:00
Daniel Golle 51ee3fa19a fbtest: remove the fbdev test tool
The tool opens /dev/fb0 and mmaps it. Legacy fbdev and DRM fbdev
emulation are gone from every target except the exempt ones, so the
device node it needs is absent there. Nothing depends on the package.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
2026-10-06 18:35:40 +01:00
Josef Schlehofer a31b1b75cb px5g-mbedtls: default to 2048 bit RSA keys
px5g uses a 512 bit RSA key by default, for rsakey without a size and
for selfsigned without -newkey. mbedtls 3.6 refuses to generate RSA
keys smaller than MBEDTLS_RSA_GEN_KEY_MIN_BITS, which is 1024 bits, so
both commands fail with "error: key generation failed". OpenWrt uses
mbedtls 3.6 since 24.10.

Use 2048 bits as the default RSA key size, like px5g-wolfssl and
OpenSSL do.

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/25629
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-10-06 13:34:56 +02:00
Satoshi Ikeuchi 2f7f5b0c49 utils: add configurable Bluetooth UART attachment
Use a generic procd service around the foreground BlueZ btattach utility.
Configure the UART, protocol and speed through UCI, without router
identity checks or GPIO operations in the attachment service.

Leave attachment disabled and the device unset by default. Keep board
wiring in the device tree and use the existing HCI UART and BlueZ packages.

Tested controller startup after cold power-on, LE discovery, connection
and service discovery on LN6001.

Signed-off-by: Satoshi Ikeuchi <satosan.ikm@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/25594
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-10-05 13:55:37 +02:00
Josef Schlehofer 9cad8741a7 px5g-mbedtls: reject unsupported -addext values
An -addext value is only consumed if it starts with "extendedKeyUsage="
or with "subjectAltName=" and contains a colon. Any other value, for
example "subjectAltName=localhost" or the OpenSSL spelling
"subjectAltName = DNS:x", stops the option parser, so px5g ignores all
options after it, for example -keyout and -out. A comma separated list
like "DNS:a,DNS:b", as OpenSSL takes it, ends up as a single bogus
name. An empty name like "subjectAltName=DNS:" is written into the
certificate, although OpenSSL refuses it. Email addresses are only
accepted with the type EMAIL, while OpenSSL calls it email.

extendedKeyUsage has similar problems. A value other than serverAuth or
any leaves an empty OID in the extension, values are matched by prefix,
and only the last of several extendedKeyUsage options is used.

Fail with an error on unsupported values, on empty names and on any
comma in a subjectAltName, which OpenSSL takes as a separator even in a
URI. Accept the type email as well. Compare the usage exactly, also
accepting the OpenSSL name anyExtendedKeyUsage, and keep all given
usages. Check the result of adding them and fail if mbedtls refuses
them, for example 26 serverAuth values, which do not fit its buffer.

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/25604
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-10-05 13:42:42 +02:00
Josef Schlehofer 54d2eb96a1 px5g-mbedtls: fix the subjectAltName extension
The subjectAltName support added in commit efca89daef ("px5g-mbedtls:
add subjectAltName and extendedKeyUsage to SSL certs") has these bugs:

- Every IP entry is written with a length of 16 bytes. An IPv4 address
  ends up as a zero padded IPv6 address, so 192.168.1.1 becomes
  C0A8:101:: and clients reject the certificate for that address.
- All IP entries share one buffer, so each of them carries the address
  given last.
- An invalid IP address is not rejected but written as :: or as the
  address of an earlier IP entry.
- The list is linked after every option instead of only after a new
  entry. If any other option follows the last subjectAltName, that
  entry points to itself. Adding the extension then loops until the
  size counter overflows, which never ends on 64-bit targets and drops
  the whole extension on 32-bit targets.
- An unknown entry type only prints a warning. It stays in the list
  with type 0, which mbedtls cannot write, so the whole extension is
  dropped while px5g still exits with 0.
- Without any subjectAltName, the extension is written with an empty
  list, which RFC 5280 does not allow. Chrome rejects such a
  certificate with ERR_CERT_INVALID and, unlike for other self-signed
  certificates, does not offer to proceed.

Use the length returned by mbedtls_x509_crt_parse_cn_inet_pton(),
allocate a buffer for each IP entry and link only new entries. Reject
invalid IP addresses and unknown entry types with an error. Add the
extension only if there are entries and fail with an error if mbedtls
refuses it.

Signed-off-by: Josef Schlehofer <pepe.schlehofer@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/25604
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-10-05 13:42:42 +02:00
Felix Fietkau 83e7914958 provision: name the create command in the not-found message
The message told the user to run "provision enable", but no such command
exists. The command that makes the partition is "provision create".

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-09-29 17:29:25 +02:00
Daniel Golle c375123b3b kernel: drop the audio and display feature gates
The sound and DRM modules carry a dependency on audio-support and
video-support, which is what decides whether an image handles those
devices. The AUDIO_SUPPORT and DISPLAY_SUPPORT tokens beside them add a
second, per-SoC-family condition that a board cannot influence, and that
DISPLAY_SUPPORT is half derived from whatever kernel configuration was
copied into a target's fragment.

Drop the tokens from the module dependencies and from fbtest.

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
2026-09-29 15:29:43 +01:00
Joshua Covington afe0f08a6f bcm27xx-utils: update to Git HEAD as of 2026.09.17
Update to Git HEAD as of 2026-09-17

Update patches:
- 0001-raspinfo-adapt-to-OpenWrt.patch: rebase, note vclog alongside
  vcdbg when neither is found
- 1001-rpifwcrypto-switch-from-GnuTLS-to-OpenSSL.patch: add proper
  commit message; update documentation where needed; fix hash_file()
  to bound the memcpy by the actual digest length instead of always
  copying SHA256_HASH_SIZE bytes
- 1002-piolib-make-piolib-a-shared-library.patch: add proper commit
  message and update documentation where needed
- Add 1003-cmake-disable-splashasm.patch: splashasm is not needed
  for the OpenWrt build at this time

Fixes: a296a5adf7 ("bcm27xx-utils: update to 20260621, add rpi-fw-crypto and piolib")

Signed-off-by: Joshua Covington <joshuacov@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/25243
Signed-off-by: Jonas Jelonek <jonas@jonasjelonek.de>
2026-09-27 10:18:32 +02:00
John Crispin bb332115ba package: build mtd-utils, libsepol and libselinux in parallel
A package builds with -j1 unless it sets PKG_BUILD_PARALLEL, and 171 of
the 220 packages do not set it. These three gain the most from the job
server on a cold build of this tree:

  mtd-utils   24.77 s -> 6.43 s
  libsepol    17.99 s -> 2.18 s
  libselinux   7.82 s -> 1.89 s

mtd-utils runs while nothing else does, so its 18 s count against the
wall clock in full.

Each one builds three times out of three with the job server, and each
build writes a tree that is identical to the one a serial build writes.
nftables gains as well, 17.9 s to 13.0 s, but it is left alone: its
build directory differs between two serial builds, so the check that
covers the other three says nothing about it.

Signed-off-by: John Crispin <john@phrozen.org>
2026-09-22 18:18:58 +02:00
Eric Fahlgren 0ab0a1d669 busybox: enable shell history reverse search
Following on from e23b37b, it makes sense to also enable searching
the history rather that just relying on up and down arrow while
scanning the results.

On both x86 and ath79, busybox binary is ~4.2k bigger.  The resulting
x86 .apk is 447 bytes bigger and mips_24kc .apk is 324 bytes bigger.

Signed-off-by: Eric Fahlgren <ericfahlgren@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23953
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-09-16 18:44:26 +02:00
Vladimir Zadirei 5f62b79d1c adb: fix RSA authentication with mbedTLS
ADB authentication signs the 20-byte challenge directly as a SHA-1
digest. The mbedTLS port hashes the challenge before signing it,
causing adbd to reject every signature and request user approval
after each server restart.

Pass the challenge directly to mbedtls_pk_sign(), matching the former
RSA_sign() behavior.

Signed-off-by: Vladimir Zadirei <v.zadirei@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/24946
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-09-09 17:33:30 +02:00
Felix Fietkau 5b3b961f41 ucode-mod-bpf: bump PKG_RELEASE
Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau 9565a9bd91 ucode-mod-bpf: add map info method and map type constants
Scripts need the map type to know how to interact with a map, e.g.
per-CPU value handling or keyless queue/stack semantics. Add an
info() map method returning type, key/value size and max_entries,
along with BPF_MAP_TYPE constants for comparison.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau a148933214 ucode-mod-bpf: add ring buffer and perf event buffer support
Add consumer support for BPF_MAP_TYPE_RINGBUF and
BPF_MAP_TYPE_PERF_EVENT_ARRAY maps. ringbuf(callback) and
perf_buffer(callback, pages, lost_callback) map methods return a
buffer resource with fileno, poll and consume methods. The fileno
method exposes the epoll fd and matches the interface uloop.handle()
expects, so a buffer can be passed directly to uloop for event loop
integration.

The ring buffer callback receives the sample data and may return a
negative integer to stop consumption; the perf callbacks additionally
receive the CPU number.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau 9b7ddbaef9 ucode-mod-bpf: add map-in-map and prog array support
Updates on array/hash-of-maps and prog array maps take the fd of the
inner object as a 4-byte value. Accept bpf.map and bpf.program
resources as map values and convert them to their fd.

Lookups on map-in-map types return the inner map id; add open_map_id
and open_program_id to obtain a usable object from such an id.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau ec06937a5a ucode-mod-bpf: add support for keyless maps
Queue and stack maps have zero-sized keys and require a NULL key
pointer; the kernel rejects any non-NULL key with EINVAL, making
these maps unusable. Accept a null key argument on maps without a
key, mapping get() to peek, set() to push and delete() with return
to pop.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau 9070d0e630 ucode-mod-bpf: add per-CPU map support
Lookup, update and lookup-and-delete on per-CPU maps use buffers of
roundup(value_size, 8) * num_possible_cpus bytes. The previous code
sized buffers for a single value, so get() on a per-CPU map made the
kernel overflow the stack buffer and set() passed undersized data.

Track the map type and size the buffers accordingly. get() and
delete() with return now yield an array with one value per CPU, set()
accepts either such an array or a single value replicated to all
CPUs.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau acc687da84 ucode-mod-bpf: fix error reporting in tc hook setup
Failures in the detach path returned NULL without recording any error
state, so error() reported a stale or empty error. Attach failures
reported a hardcoded ENOENT regardless of the actual cause. Record
errno for all failures; if_nametoindex, bpf_tc_attach and
bpf_tc_detach all set it.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau 05208d9a7e ucode-mod-bpf: fix stale errno when rodata map is missing
bpf_object__next_map does not set errno when it runs out of maps, so
the reported error code was whatever errno happened to hold. With
errno 0 the failure was invisible to error(). Report ENOENT instead.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau e04461835a ucode-mod-bpf: fix unaligned access in integer iterator
The iterator key buffer is a flexible array member placed directly
after a bool, leaving it without natural alignment for the u32/u64
loads in next_int. Copy the key via memcpy instead of dereferencing
a misaligned pointer, which traps on strict-alignment targets.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau 5c35e410fc ucode-mod-bpf: fix key/value aliasing in map argument conversion
uc_bpf_map_arg converted integer arguments through a single static
buffer. When map set was called with both an integer key and an integer
value, the second conversion overwrote the first, so the element was
written at the wrong key. Convert into a caller-provided buffer
instead.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau 3c5e204abe ucode-mod-bpf: fix missing resource pointer checks
uc_fn_thisval can return NULL when a method is called with a foreign or
missing this context. pin, foreach and the iterator next functions
dereferenced the result without checking it, crashing the VM.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-20 10:43:36 +02:00
Felix Fietkau 23ac692e6d ucode: update to Git HEAD (2026-07-09)
20a2ae469089 io: support older linux ioctls
16929698e2d3 fs: implement ioctl for macOS
395bb888bd69 io: implement ioctl for macOS
8d7d15ee1a08 compiler: add support for shorthand method declarations
7d9febd13305 nl80211: add mesh peer link enum macros to constants list
e851bb64df91 lib: avoid allocating print buffer before NULL check in uc_error_message_indent
5f3a7b87d962 compiler: prevent unbounded recompilation on failed module imports
e2493b577250 compiler: scope named function expression names to their own body
c3f0d27d812e tests: add regression test for named function expression scoping
738b55299966 vm: release owned value when property assignment fails
1ffd7c5a1011 vm: fix out-of-bounds read in single-name module import
a255256db106 vm: fix SIGFPE on INT64_MIN division and modulo by -1
3f4b313d7d78 vm: do not assign to undeclared variables in strict mode
e523682670a2 vm: release upvalue reference when resolving it on stack push
6a837090bea3 vm: release module scope reference in dynamic import
395a0a16b4f9 vm: guard error context capture against empty callframe stack
04f103bb2270 vm: respect exponent parity in integer exponentiation
bd814a4b2ae3 vm: use UC_ARRAY instead of json_type_array in object spread
5a79aa56c15e vm: release resource type prototypes after the final GC
9c5f16c8e33a lexer: do not treat /*/ as a complete block comment
a018067fd12e lexer: preserve NUL bytes in regular expression literals
65d41a1929de lexer: do not consume a sign into hexadecimal number literals
05f9bf9e5d53 lexer: fix source position of ternary question mark token
7bca646e5f88 lib: preserve embedded NUL bytes in reverse()
6fc93bf5bd95 lib: preserve embedded NUL bytes in lc() and uc()
a51f4843bce5 lib: avoid passing a signed char to isxdigit() in hex()
e8af70e4375c compiler: fix use-after-free of shorthand method name
467fb4406a47 compiler: declare leading variable in counting for loop initializer
d256e153799b rtnl: fix stack buffer overflow parsing IFLA_LINKINFO
f741ac0a144c rtnl: fix stack buffer overflow parsing RTA_MULTIPATH nexthops
c41310f7c2df rtnl: fix inverted address check in multipath nexthop parsing

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-16 11:50:22 +02:00
Felix Fietkau 7987b1f799 ucode: fix two compiler issues
- When working with deeply nested imports, compile errors led to long
  error messages or complete hangs by compiling the same module over
  and over again.
- Fix for a function expression scope issue.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-07-07 10:46:12 +02:00
Joshua Covington a296a5adf7 bcm27xx-utils: update to 20260621, add rpi-fw-crypto and piolib
Update to the latest Git HEAD (2026-06-21)

bcm27xx-utils:
Separate rpi-fw-crypto and piolib into separate packages
Update required dependencies

rpi-fw-crypto:
switch from GnuTLS to OpenSSL

piolib:
build as a separate lib. Update the CMakeLists.txt file

Signed-off-by: Joshua Covington <joshuacov@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23703
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-07-07 08:48:42 +02:00
Pavlo Samko a4e5c3b8f6 nilfs-utils: update to 2.3.1
Changelog: https://nilfs.sourceforge.io/download/ChangeLog-utils-v2

Signed-off-by: Pavlo Samko <bulldozerbsg@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23995
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-07-05 23:41:36 +02:00
Carsten Schuette cdf9158508 dtc: update to 1.8.1
Changelog:
https://git.kernel.org/pub/scm/utils/dtc/dtc.git/tag/?h=v1.8.1
https://git.kernel.org/pub/scm/utils/dtc/dtc.git/tag/?h=v1.8.0

This also fixes #23671

Signed-off-by: Carsten Schuette <schuettecarsten@googlemail.com>
Link: https://github.com/openwrt/openwrt/pull/23677
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-06-27 16:24:14 +02:00
John Crispin b8175a021b netifd: dhcp: add restart command for clean lease re-acquire
Add a proto_dhcp_restart() handler that re-acquires the DHCP lease via a
single ubus call, releasing the previous lease and triggering a fresh
DHCPDISCOVER without bouncing the interface.

The re-acquire is implemented by sending SIGHUP to udhcpc, which releases
the current lease (if any) and immediately transitions the state machine
to INIT_SELECTING so the next main-loop iteration sends a fresh
DHCPDISCOVER. A single signal thus expresses 'release this lease and get
a new one' without exiting the client, so upstream watchdogs (e.g. a
DNS-health monitor) can request a clean re-lease without tearing down the
interface.

Signed-off-by: John Crispin <john@phrozen.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-06-24 11:21:28 +02:00
John Crispin 87f5376eb7 busybox: enable timeout utility by default
Small cost, but can be of use for non-interactive scripts.

Signed-off-by: John Crispin <john@phrozen.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-06-24 11:21:28 +02:00
Thomas Weißschuh 11865bffc8 util-linux: update to 2.42.2
Release notes:
https://www.kernel.org/pub/linux/utils/util-linux/v2.42/v2.42.2-ReleaseNotes

Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
Link: https://github.com/openwrt/openwrt/pull/23844
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-06-24 02:14:33 +02:00
Hauke Mehrtens 7e7bd602ea fritz-tools: fix out-of-bounds memset in TFFS segment expansion
When growing the segment array in find_entry(), the memset() that zeroes
the newly allocated slots computed the destination with redundant sizeof
scaling:

  memset(segments + (num_segments * sizeof(struct tffs_entry_segment)), ...)

segments is a typed pointer, so pointer arithmetic already scales by the
element size. Multiplying the offset by sizeof again advances the
destination by num_segments * sizeof^2 bytes, landing far outside the
realloc()'d buffer and zeroing unrelated heap memory whenever a TFFS
entry spans multiple segments that require array expansion.

Drop the redundant multiplication so the memset targets segments[num_segments].

This is a robustness fix for malformed/corrupt TFFS content; the parser
only reads the on-device nand-tffs MTD partition as root, so it is not
considered security relevant.

Reported-by: @Vasco0x4
Assisted-by: Claude:claude-opus-4-8
Link: https://github.com/openwrt/openwrt/pull/23763
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-06-16 00:51:53 +02:00
Seo Suchan 24662e811e busybox: fix signal handling in non-interactive envirement
fixes  https://github.com/openwrt/openwrt/issues/23745

upstream had bug bb_got_signal to be never cleared in noninteractive session, this fixes this while waiting for upstream merge.

the patch iself is written by  Ian Cooper <iancooper@hotmail.com>

Signed-off-by: Seo Suchan <tjtncks@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23787
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-06-14 11:51:50 +02:00
Rosen Penev f079f0252b nvram: use strdup
No need for malloc + strcpy.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22370
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-06-11 10:33:00 +02:00
Rosen Penev 113d3edce0 nvram: move variable assignment out of if
More readable.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22370
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-06-11 10:33:00 +02:00
Rosen Penev 55d146432f nvram: use flex array
Clarifies that the struct needs to be over allocated.

Signed-off-by: Rosen Penev <rosenp@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/22370
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-06-11 10:32:59 +02:00
Pavlo Samko 84f4f77920 nilfs-utils: update to 2.3.0
Changelog: https://nilfs.sourceforge.io/download/ChangeLog-utils-v2

Signed-off-by: Pavlo Samko <bulldozerbsg@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/21932
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-06-03 13:46:09 +02:00
Felix Fietkau 76e6216c8a ucode: update to Git HEAD (2026-06-03)
1ac496a91a30 math: min and max
4c917958038d math: clamp
c6404b6af75c math: sign functions
597b17d0edea math: copysign
9747c8bbfa27 math: floor
933b11802060 math: ceil
46581cf13149 math: round
4aee92d5aa89 math: trunc
c8f71433a3d6 math: log functions
840aa6e61196 math: Infinity handling note
990558c2a027 math: isinf
c3e76e45fdad math: tan
08c6ef98fa2f math: acos, asin, atan
21a0f37d4c7c math: cosh, sinh, tanh
28ec6e4466b5 math: cbrt, hypot
fb2fc094875c math: expm1, log1p
1a911dbc72b0 math: jsdoc fixes
7b3b15dc7d25 math: add double/int output toggle flag to floor/ceil/round/trunc
7424c3bd14e0 make: improve make (install) on macOS
965d76557dee types: release previous prototype reference in ucv_prototype_set
b702323ec137 uloop: unregister task output fd from uloop before closing it
106b1179765a uloop: clear resource values when releasing callback resources
acc70db934fc ubus: clear resource values when releasing connection/object resources
9d7ade9e4c68 ubus: prevent UAF when channel disconnect_cb triggers re-entrant disconnect

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-06-03 13:13:17 +02:00
Seo Suchan fe04581880 busybox: update to 1.38.0
changelog:
https://busybox.net/news.html
remove upstreamed patches:
001-fix-non-x86-build.patch
002-upstream-fix.hexdump.patch
003-hexdump-fix-regression-for-unit16-on-big-endian-systems.patch

see https://github.com/openwrt/openwrt/pull/17107 for updating config

Config refresh:

Refresh commands, run after busybox is first built once, slash or lack of slash at end of path matters!:

cd package/utils/busybox/config/
../convert_menuconfig.pl ../../../../build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/busybox-default/busybox-1.38.0
cd ..
./convert_defaults.pl ../../../build_dir/target-arm_cortex-a15+neon-vfpv4_musl_eabi/busybox-default/busybox-1.38.0/.config > Config-defaults.in

Manual edits needed after config refresh:

* Config-defaults.in: OpenWrt config symbol IPV6 logic applied to
  BUSYBOX_DEFAULT_FEATURE_IPV6

* Config-defaults.in: OpenWrt config TARGET_bcm53xx logic applied to
  BUSYBOX_DEFAULT_TRUNCATE (commit 547f1ec)

* Config-defaults.in: OpenWrt logic applied to
  BUSYBOX_DEFAULT_LOGIN_SESSION_AS_CHILD (commit dc92917)

* Config-defaults.in: correct the default ports that get reset
  BUSYBOX_DEFAULT_FEATURE_HTTPD_PORT_DEFAULT    80
  BUSYBOX_DEFAULT_FEATURE_TELNETD_PORT_DEFAULT  23

* config/editors/Config.in: Add USE_GLIBC dependency to
  BUSYBOX_CONFIG_FEATURE_VI_REGEX_SEARCH (commit f141090)

* config/shell/Config.in: change at "Options common to all shells" the conditional symbol
  SHELL_ASH --> BUSYBOX_CONFIG_SHELL_ASH
  (discussion in http://lists.openwrt.org/pipermail/openwrt-devel/2021-January/033140.html
  Apparently our script does not see the hidden option while
  prepending config options with "BUSYBOX_CONFIG_" which leads to a
  missed dependency when the options are later evaluated.)

* Edit a few Config.in files by adding quotes to sourced items in
  config/Config.in, config/networking/Config.in and config/util-linux/Config.in (commit 1da014f)

Signed-off-by: Seo Suchan <tjtncks@gmail.com>
Link: https://github.com/openwrt/openwrt/pull/23609
Signed-off-by: Jonas Jelonek <jelonek.jonas@gmail.com>
2026-06-02 20:43:53 +02:00
Marek Behún 2f93ba1b5b omnia-mcutool: Bump version to 0.3-rc4
Bump version to 0.3-rc4, which fixes building with C23.

Signed-off-by: Marek Behún <kabel@kernel.org>
Link: https://github.com/openwrt/openwrt/pull/23620
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-06-02 13:37:37 +02:00
Thomas Weißschuh e64d688ea4 util-linux: update to 2.42.1
Release notes:
https://www.kernel.org/pub/linux/utils/util-linux/v2.42/v2.42.1-ReleaseNotes

Upstreamed:
0001-meson-test-for-statx-stx_mnt_id-in-sys-stat.h.patch
0001-nsenter-Fix-AT_HANDLE_FID-on-musl.patch

Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
Link: https://github.com/openwrt/openwrt/pull/23432
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-05-19 23:39:29 +02:00
Felix Fietkau 4ae4759e0b ucode: update to Git HEAD (2026-04-24)
3d999b21f4ba socket: add include for older kernels
552ca3cf55ed compiler: allow export function declarations without trailing semicolon
d9e24e4ad13d compiler: add function forward declaration syntax
de986520017a fs: add statvfs flags and fs error codes
e6bf0a9dca79 nl80211: fix listener.request() dropping multicast events
520d9f4c8781 nl80211: fix waitfor() busy-spinning on non-blocking event socket
05328e33f078 nl80211: fix memory leak in waitfor() on repeated matching events
e4a165976dbb nl80211: don't report waitfor() match on event parse failure
57367e880e9d nl80211: add missing survey info attributes
a39b74fe329e nl80211: fix dfs_cac_time attribute type
beafcff845fc compiler, lib, resolv: fix const string pointers
4170c8dcc568 lib: fix system() inheriting blocked SIGCHLD mask in child process
d2c74298e22d fs: document glob
8a8b4d12a867 types: fix regexp `/.../s` flag inversion
d7bc7adcb99d lib: slightly expand regexp() JSDoc
826fbfef2df9 nl80211: fix HE MCS set parsing
617967a3ceb9 socket: strip brackets from IPv6 addresses in addrinfo()
a078b72a90bb socket: increase IPv6 scope ID buffer to support 15-char interface names
ed23cf5aa182 rtnl, nl80211: fix segfault when listener.close() is called explicitly
3e585662394b docs: add function forward declarations to syntax tutorial
bda4a0e454de vm: free thread context on vm_free to prevent memory leak
13158a73c96b nl80211: get iftype extended capabilites
30ffbd6c07dc ubus: add module documentation
ce0c8fc0ffea docs: spelling fixes and usage notes
35a74e92ad69 docs: rewrite ubus module intro to expand pub/sub and fix OpenWrt capitalization
b3380068a7e1 docs: flatten ubus class hierarchy and fix capitalization
3c9d3b5272d7 docs: math: fix spelling mistakes in documentation
aae2250ab519 fs: fix popen() documentation
eff52f0d262a digest: implement FNV-1a 64 bit hash algorithm
35ed1d1efd64 ubus: fix refcounting bug
c7e7dfa7b64a ubus: avoid double close of externally owned channel fds
896ac72caffb tests: make run_tests.uc default to build/
b50372e8e8a0 tests: implement automatic library test skipping
81066c54a07f math: degrees <-> radians convertors
388ef3f35e0a ubus: drop unconditional garbage collection calls
aebdb2c0262e main: fix option argument parsing on glibc

Signed-off-by: Felix Fietkau <nbd@nbd.name>
2026-05-04 16:29:36 +02:00
Alexandru Ardelean bbae0e5c09 secilc: update to 3.10
Release Notes:
https://github.com/SELinuxProject/selinux/wiki/Releases#release-310

Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
Link: https://github.com/openwrt/openwrt/pull/23082
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-27 10:50:54 +02:00
Alexandru Ardelean 153a2cba71 policycoreutils: update to 3.10
Release Notes:
https://github.com/SELinuxProject/selinux/wiki/Releases#release-310

Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
Link: https://github.com/openwrt/openwrt/pull/23082
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-27 10:50:53 +02:00
Alexandru Ardelean e14133919c checkpolicy: update to 3.10
Release Notes:
https://github.com/SELinuxProject/selinux/wiki/Releases#release-310

Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
Link: https://github.com/openwrt/openwrt/pull/23082
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-27 10:50:53 +02:00
Thomas Weißschuh d7512950ba util-linux: fix build on Linux v6.18 against musl
Backport an upstream patch to avoid usages of an undefined
AT_HANDLE_FID.

Closes: https://github.com/openwrt/openwrt/issues/23058
Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
Link: https://github.com/openwrt/openwrt/pull/23059
Signed-off-by: Robert Marko <robimarko@gmail.com>
2026-04-24 10:18:53 +02:00
Thomas Weißschuh 1a1bdcdc2a util-linux: update to 2.42
Release notes:
https://www.kernel.org/pub/linux/utils/util-linux/v2.42/v2.42-ReleaseNotes

New:
0001-meson-test-for-statx-stx_mnt_id-in-sys-stat.h.patch

Signed-off-by: Thomas Weißschuh <thomas@t-8ch.de>
Link: https://github.com/openwrt/openwrt/pull/22878
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
2026-04-23 01:08:36 +02:00