Security
- CACHE_BUST build arg for Docker layer cache invalidation:
--pullalone was
insufficient — if the Alpine base image tag hasn't been rebuilt, Docker layer
caching preserves staleapk upgradeoutput. AddedARG CACHE_BUSTin the
runtime stage and--build-arg CACHE_BUST=$CI_PIPELINE_IDto all CI Docker
build commands, ensuring every pipeline runs a freshapk upgrade - Reconciler race condition: Added
reconcileMumutex to serialize
Reconcile()calls, preventing concurrent map access - Case-sensitive hostname comparison: Fixed orphan cleanup to use
source.NormalizeHostname()for consistent case-insensitive hostname matching - SSH config
getEnvOrFilealignment: When_FILEkey is set but file is
unreadable, now returns empty string (hard-fail) matching config behavior - Dry-run orphan accuracy: Always build record cache (was nil in dry-run mode);
refactored deletion functions to check dry-run per-record - RecoverOwnership error handling: Now returns error listing failed providers
instead of silently continuing - Bounded HTTP response reading: Replaced all
io.ReadAllcalls in Pi-hole
client withhttputil.ReadBody(10 MB limit) to prevent memory exhaustion - Integer overflow guards: Added
gosec G115clamps — TTL touint32in
RFC 2136, SRV/HTTPS fields touint16in Technitium
Fixed
- Hostname provider map initialization: Initialize
hostnameProvidersmap in
New()instead of lazy nil check
Docker Images
docker pull ghcr.io/maxfield-allison/dnsweaver:v1.1.3
docker pull docker.io/maxamill/dnsweaver:v1.1.3