From 55ecc3a88670c14bbbfc9d6c96cf65891cc608f5 Mon Sep 17 00:00:00 2001 From: Andy Pan Date: Mon, 15 Aug 2022 23:09:00 +0800 Subject: [PATCH] net: allow single dot in resolv.conf search statement A single dot in a search statement doesn't affect DNS lookup, so just ignore it and a syntax error. Fixes #54124 Change-Id: Idd43bd34c5c16af50cba51f0b6e24f992eec6e57 Reviewed-on: https://go-review.googlesource.com/c/go/+/423875 Run-TryBot: Ian Lance Taylor Auto-Submit: Ian Lance Taylor Reviewed-by: Bryan Mills TryBot-Result: Gopher Robot Run-TryBot: Ian Lance Taylor Reviewed-by: Ian Lance Taylor --- src/net/dnsconfig_unix.go | 10 +++++++--- src/net/dnsconfig_unix_test.go | 13 +++++++++++++ src/net/testdata/search-single-dot-resolv.conf | 5 +++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 src/net/testdata/search-single-dot-resolv.conf diff --git a/src/net/dnsconfig_unix.go b/src/net/dnsconfig_unix.go index 3ba6d44fc3..65098f6827 100644 --- a/src/net/dnsconfig_unix.go +++ b/src/net/dnsconfig_unix.go @@ -64,9 +64,13 @@ func dnsReadConfig(filename string) *dnsConfig { } case "search": // set search path to given servers - conf.search = make([]string, len(f)-1) - for i := 0; i < len(conf.search); i++ { - conf.search[i] = ensureRooted(f[i+1]) + conf.search = make([]string, 0, len(f)-1) + for i := 1; i < len(f); i++ { + name := ensureRooted(f[i]) + if name == "." { + continue + } + conf.search = append(conf.search, name) } case "options": // magic options diff --git a/src/net/dnsconfig_unix_test.go b/src/net/dnsconfig_unix_test.go index 513f624b00..9be751f2e3 100644 --- a/src/net/dnsconfig_unix_test.go +++ b/src/net/dnsconfig_unix_test.go @@ -52,6 +52,16 @@ var dnsReadConfigTests = []struct { attempts: 2, }, }, + { + name: "testdata/search-single-dot-resolv.conf", + want: &dnsConfig{ + servers: []string{"8.8.8.8:53"}, + search: []string{}, + ndots: 1, + timeout: 5 * time.Second, + attempts: 2, + }, + }, { name: "testdata/empty-resolv.conf", want: &dnsConfig{ @@ -166,6 +176,9 @@ func TestDNSReadConfig(t *testing.T) { getHostname = func() (string, error) { return "host.domain.local", nil } for _, tt := range dnsReadConfigTests { + if len(tt.want.search) == 0 { + tt.want.search = append(tt.want.search, dnsDefaultSearch()...) + } conf := dnsReadConfig(tt.name) if conf.err != nil { t.Fatal(conf.err) diff --git a/src/net/testdata/search-single-dot-resolv.conf b/src/net/testdata/search-single-dot-resolv.conf new file mode 100644 index 0000000000..934cd3e97c --- /dev/null +++ b/src/net/testdata/search-single-dot-resolv.conf @@ -0,0 +1,5 @@ +# /etc/resolv.conf + +domain localdomain +search . +nameserver 8.8.8.8 -- 2.50.0