From 620b51e3ea1bfdd712f24873acf5cde57837b720 Mon Sep 17 00:00:00 2001 From: Eugene Burkov Date: Fri, 21 Apr 2023 18:57:53 +0300 Subject: [PATCH] Pull request 1840: 5752-unspec-ipv6 Merge in DNS/adguard-home from 5752-unspec-ipv6 to master Closes #5752. Squashed commit of the following: commit 654b808d17c6d2374b6be919515113b361fc5ff7 Author: Eugene Burkov Date: Fri Apr 21 18:11:34 2023 +0300 home: imp docs commit 28b4c36df790f1eaa05b11a1f0a7b986894d37dc Author: Eugene Burkov Date: Fri Apr 21 16:50:16 2023 +0300 all: fix empty bind host --- CHANGELOG.md | 6 ++++++ docker/dns-bind.awk | 2 +- internal/home/config.go | 23 +++++++++++++++++++++++ internal/home/upgrade.go | 3 ++- 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51ac99b1..314a4646 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,11 @@ NOTE: Add new changes BELOW THIS COMMENT. ### Fixed +- Unquoted IPv6 bind hosts with trailing colons erroneously considered + unspecified addresses are now properly validated ([#5752]). + + **NOTE:** the Docker healthcheck script now also doesn't interpret the `""` + value as unspecified address. - Incorrect `Content-Type` header value in `POST /control/version.json` and `GET /control/dhcp/interfaces` HTTP APIs ([#5716]). - Provided bootstrap servers are now used to resolve the hostnames of plain @@ -64,6 +69,7 @@ See also the [v0.107.29 GitHub milestone][ms-v0.107.29]. [#5712]: https://github.com/AdguardTeam/AdGuardHome/issues/5712 [#5721]: https://github.com/AdguardTeam/AdGuardHome/issues/5721 [#5725]: https://github.com/AdguardTeam/AdGuardHome/issues/5725 +[#5752]: https://github.com/AdguardTeam/AdGuardHome/issues/5752 [ms-v0.107.29]: https://github.com/AdguardTeam/AdGuardHome/milestone/65?closed=1 diff --git a/docker/dns-bind.awk b/docker/dns-bind.awk index 778ebec0..abb5747c 100644 --- a/docker/dns-bind.awk +++ b/docker/dns-bind.awk @@ -7,7 +7,7 @@ addrs[$2] = true prev_line = FNR - if ($2 == "0.0.0.0" || $2 == "\"\"" || $2 == "'::'") { + if ($2 == "0.0.0.0" || $2 == "'::'") { # Drop all the other addresses. delete addrs addrs[""] = true diff --git a/internal/home/config.go b/internal/home/config.go index c97e671c..bd3d7e49 100644 --- a/internal/home/config.go +++ b/internal/home/config.go @@ -414,6 +414,22 @@ func getLogSettings() logSettings { return l } +// validateBindHosts returns error if any of binding hosts from configuration is +// not a valid IP address. +func validateBindHosts(conf *configuration) (err error) { + if !conf.BindHost.IsValid() { + return errors.Error("bind_host is not a valid ip address") + } + + for i, addr := range conf.DNS.BindHosts { + if !addr.IsValid() { + return fmt.Errorf("dns.bind_hosts at index %d is not a valid ip address", i) + } + } + + return nil +} + // parseConfig loads configuration from the YAML file func parseConfig() (err error) { var fileData []byte @@ -425,6 +441,13 @@ func parseConfig() (err error) { config.fileData = nil err = yaml.Unmarshal(fileData, &config) if err != nil { + // Don't wrap the error since it's informative enough as is. + return err + } + + err = validateBindHosts(config) + if err != nil { + // Don't wrap the error since it's informative enough as is. return err } diff --git a/internal/home/upgrade.go b/internal/home/upgrade.go index a97386a7..81168561 100644 --- a/internal/home/upgrade.go +++ b/internal/home/upgrade.go @@ -41,7 +41,8 @@ func upgradeConfig() error { err = yaml.Unmarshal(body, &diskConf) if err != nil { - log.Printf("Couldn't parse config file: %s", err) + log.Printf("parsing config file for upgrade: %s", err) + return err }