Files
packages/libs/avahi/test.sh
T
Alexandru Ardelean 24c3026f94 avahi: update to 0.9-rc4
Fixes https://github.com/openwrt/packages/issues/27952

Update avahi from 0.8 to 0.9-rc4. The 0.9 development line accumulates
four years of bug and security fixes since the 0.8 release (2020-02-18).

Notable improvements in 0.9-rc4 over 0.8:

Security (all CVEs previously backported as patches, now removed):
  - CVE-2023-38469: reject TXT records whose total rdata exceeds
    AVAHI_DNS_RDATA_MAX, preventing heap-buffer reads under crafted mDNS
  - CVE-2023-38470: ensure each DNS label is at least one byte, preventing
    an infinite loop on malformed packets
  - CVE-2023-38471: extract host name via avahi_unescape_label() before
    generating an alternative to avoid operating on a raw escaped string
  - CVE-2023-38472: check that rdata pointer is non-NULL before passing to
    avahi_rdata_parse() from dbus-entry-group
  - CVE-2023-38473: derive alternative host name from its unescaped form,
    fixing incorrect hostname collision resolution with escaped labels

Bug fixes (previously backported):
  - Fix NULL-pointer crashes in avahi_s_*_browser_new() (#175)
  - Avoid infinite loop in avahi-daemon simple-protocol by handling
    AVAHI_WATCH_HUP event in client_work
  - Fix potential undefined behaviour in avahi_dns_packet_consume_uint32:
    cast uint8_t operands to uint32_t before shifting
  - Fix memory/CPU leak in the simple event loop: cleanup_watches() was
    zeroing timeout_req_cleanup instead of watch_req_cleanup, so completed
    watches were never removed from the linked list
  - Emit D-Bus error reply when avahi-daemon cannot resolve a hostname or
    service, rather than crashing with a NULL dereference
  - Increase ini-file-parser line buffer from 256 to 1024 bytes to handle
    longer configuration values without silent truncation

Other changes:
  - P2P tunnel support: IFF_MULTICAST is no longer required for
    point-to-point interfaces when allow-point-to-point=yes
  - Runtime directory: configure.ac now derives the socket path from
    ${runstatedir} (defaults to ${localstatedir}/run), so the
    explicit patch reverting the /run hardcoding is no longer needed
  - Patch 010-pkgconfig.patch (pkgconfig prefix alignment) is retained
    as it has not been merged upstream

Dropped patches (all merged upstream):
  020-revert-runtime-dir-systemd-change.patch
  100-p2p-no-iff_multicast-required.patch
  200-Fix-NULL-pointer-crashes-from-175.patch
  201-Avoid-infinite-loop-in-avahi-daemon-by-handling-HUP-event.patch
  202-avahi_dns_packet_consume_uint32-fix-potential-undefined-b.patch
  203-Do-not-disable-timeout-cleanup-on-watch-cleanup.patch
  204-Emit-error-if-requested-service-is-not-found.patch
  205-conf-file-line-lengths.patch
  300-CVE-2023-38469.patch through 304-CVE-2023-38473.patch

Library SONAMES unchanged: libavahi-common.so.3, libavahi-core.so.7,
libavahi-client.so.3 — no reverse dependency rebuilds required.

Disable libsystemd (not available on OpenWrt)
avahi 0.9-rc4 added --enable-libsystemd which defaults to enabled and
fails configure when libsystemd is not found via pkg-config.  OpenWrt
does not provide libsystemd; disable it explicitly.
Also pass --with-systemdsystemunitdir=no to suppress the pkg-config
lookup for the systemd unit directory.

Drop po/ subdir from build
The 0.9-rc4 tarball is a raw git archive; po/Makefile.in.in is not
pre-generated as it was in the 0.8 release tarball.  autopoint (from
gettext) is needed to install it, but is not available in the OpenWrt
SDK.  Since OpenWrt does not use NLS translations, remove po/ from
SUBDIRS in Makefile.am to avoid the missing po/Makefile.in.in error
during configure.

In 0.9-rc4 the D-Bus system.d directory changed from
$(sysconfdir)/dbus-1/system.d to $(datadir)/dbus-1/system.d,
so avahi-dbus.conf is now installed under usr/share/dbus-1/system.d.
Update the install rule source path accordingly; keep the on-device
destination at /etc/dbus-1/system.d for compatibility.

Signed-off-by: Alexandru Ardelean <alex@shruggie.ro>
2026-05-06 09:05:08 +03:00

205 lines
5.3 KiB
Bash

#!/bin/sh
_version_check() {
local bin="$1" pkg="$2" ver="$3"
# apk versions use _ where upstream uses - (e.g. 0.9_rc4 vs 0.9-rc4)
local upstream_ver
upstream_ver=$(echo "$ver" | tr '_' '-')
"$bin" -V 2>&1 | grep -F "$upstream_ver" || {
echo "FAIL: $bin -V did not print expected version '$upstream_ver'"
exit 1
}
}
_lib_check() {
local f="$1"
[ -e "$f" ] || { echo "FAIL: $f not found"; exit 1; }
}
# Test avahi-daemon startup with a minimal config.
# Works for both dbus and nodbus variants; dbus variant skips the start
# test when avahi-utils (which needs dbus) is not installed.
_daemon_start_test() {
local ver="$1"
_version_check avahi-daemon avahi-daemon "$ver"
# Config file from package
[ -f /etc/avahi/avahi-daemon.conf ] || {
echo "FAIL: /etc/avahi/avahi-daemon.conf not installed"
exit 1
}
grep -q "use-ipv4=yes" /etc/avahi/avahi-daemon.conf || {
echo "FAIL: use-ipv4=yes not found in avahi-daemon.conf"
exit 1
}
[ -d /etc/avahi/services ] || {
echo "FAIL: /etc/avahi/services directory not installed"
exit 1
}
# Try to start avahi-daemon with a minimal config and no privilege drop
mkdir -p /var/run/avahi-daemon /tmp/avahi-test
cat > /tmp/avahi-test/avahi-daemon.conf << 'EOF'
[server]
host-name=avahi-test
use-ipv4=yes
use-ipv6=no
check-response-ttl=no
use-iff-running=no
enable-dbus=no
[wide-area]
enable-wide-area=no
[publish]
publish-addresses=yes
publish-hinfo=no
publish-workstation=no
publish-domain=yes
disable-publishing=no
[reflector]
enable-reflector=no
[rlimits]
rlimit-core=0
rlimit-data=4194304
rlimit-fsize=0
rlimit-nofile=30
rlimit-stack=4194304
rlimit-nproc=3
EOF
avahi-daemon --no-drop-root --no-chroot \
--file=/tmp/avahi-test/avahi-daemon.conf \
-D 2>/tmp/avahi-test/daemon.log
# Wait for pid file
i=0
while [ $i -lt 10 ] && [ ! -f /var/run/avahi-daemon/pid ]; do
sleep 1
i=$((i + 1))
done
if [ -f /var/run/avahi-daemon/pid ]; then
echo "avahi-daemon started (pid $(cat /var/run/avahi-daemon/pid))"
# Verify socket exists
[ -e /var/run/avahi-daemon/socket ] && echo "socket present" || \
echo "NOTE: socket not present (may need network)"
# Stop the daemon
kill "$(cat /var/run/avahi-daemon/pid)" 2>/dev/null
i=0
while [ $i -lt 5 ] && [ -f /var/run/avahi-daemon/pid ]; do
sleep 1; i=$((i + 1))
done
echo "avahi-daemon stopped"
else
echo "NOTE: avahi-daemon did not start within 10s (may need network interface)"
echo "daemon log:"
cat /tmp/avahi-test/daemon.log 2>/dev/null
# Not a hard failure — network may not be available in all test envs
fi
rm -rf /tmp/avahi-test
}
_service_file_check() {
local f="$1" stype="$2" port="$3"
[ -f "$f" ] || { echo "FAIL: $f not found"; exit 1; }
# Validate it is XML and contains expected service attributes
grep -q "<service-group>" "$f" || { echo "FAIL: $f missing <service-group>"; exit 1; }
grep -q "<type>_${stype}._tcp</type>" "$f" || {
echo "FAIL: $f missing <type>_${stype}._tcp</type>"
exit 1
}
grep -q "<port>$port</port>" "$f" || {
echo "FAIL: $f missing <port>$port</port>"
exit 1
}
echo "$f: OK"
}
case "$1" in
libavahi-dbus-support)
_lib_check /usr/lib/libavahi-common.so.3
_lib_check /usr/lib/libavahi-core.so.7
# D-Bus policy file
[ -f /etc/dbus-1/system.d/avahi-dbus.conf ] || {
echo "FAIL: avahi D-Bus policy not installed"
exit 1
}
grep -q "avahi" /etc/dbus-1/system.d/avahi-dbus.conf || {
echo "FAIL: avahi-dbus.conf does not mention avahi"
exit 1
}
;;
libavahi-nodbus-support)
_lib_check /usr/lib/libavahi-common.so.3
_lib_check /usr/lib/libavahi-core.so.7
;;
libavahi-client)
_lib_check /usr/lib/libavahi-client.so.3
;;
avahi-dbus-daemon|avahi-nodbus-daemon)
_daemon_start_test "$2"
;;
avahi-autoipd)
_version_check avahi-autoipd avahi-autoipd "$2"
[ -x /usr/sbin/avahi-autoipd ] || { echo "FAIL: avahi-autoipd not executable"; exit 1; }
[ -x /etc/avahi/avahi-autoipd.action ] || {
echo "FAIL: avahi-autoipd.action script not installed"
exit 1
}
[ -f /lib/netifd/proto/autoip.sh ] || {
echo "FAIL: netifd autoip proto script not installed"
exit 1
}
;;
avahi-daemon-service-http)
_service_file_check /etc/avahi/services/http.service http 80
;;
avahi-daemon-service-ssh)
_service_file_check /etc/avahi/services/ssh.service ssh 22
;;
avahi-dnsconfd)
_version_check avahi-dnsconfd avahi-dnsconfd "$2"
[ -x /usr/sbin/avahi-dnsconfd ] || { echo "FAIL: avahi-dnsconfd not executable"; exit 1; }
[ -x /etc/avahi/avahi-dnsconfd.action ] || {
echo "FAIL: avahi-dnsconfd.action not installed"
exit 1
}
;;
avahi-utils)
# All four utilities must be present and print a help/usage line
for bin in avahi-browse avahi-publish avahi-resolve avahi-set-host-name; do
[ -x "/usr/bin/$bin" ] || { echo "FAIL: $bin not found"; exit 1; }
# --help exits non-zero on some versions; capture stderr+stdout
"$bin" --help 2>&1 | grep -qi "usage\|help\|option" || {
echo "FAIL: $bin --help produced no usage output"
exit 1
}
echo "$bin: OK"
done
# Verify avahi-browse can list service types (fails fast without daemon;
# the important thing is the binary runs and parses arguments)
avahi-browse --terminate --all 2>&1 | grep -qi "avahi\|failed\|error\|No.*daemon\|socket\|service" && \
echo "avahi-browse --terminate --all: ran" || \
echo "avahi-browse --terminate --all: no output (daemon not running)"
;;
esac