From 48d5b7f89cde90442afa6ec5964ac39894c10270 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 2 Jan 2023 19:55:57 -0800 Subject: [PATCH] net/dns/resolvconffile: fix handling of multiple search domains Fixes #6875 Change-Id: I57eb9312c9a1c81792ce2b5a0a0f254213b05df2 Signed-off-by: Brad Fitzpatrick (cherry picked from commit ea70aa3d980db1c7bd1912298167e545249c08fa) --- net/dns/resolvconffile/resolvconffile.go | 25 +++++++++++++------ net/dns/resolvconffile/resolvconffile_test.go | 25 +++++++++++++++++++ 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/net/dns/resolvconffile/resolvconffile.go b/net/dns/resolvconffile/resolvconffile.go index a1b334aa3..6b9cf0452 100644 --- a/net/dns/resolvconffile/resolvconffile.go +++ b/net/dns/resolvconffile/resolvconffile.go @@ -83,17 +83,26 @@ func Parse(r io.Reader) (*Config, error) { } if s, ok := strs.CutPrefix(line, "search"); ok { - domain := strings.TrimSpace(s) - if len(domain) == len(s) { + domains := strings.TrimSpace(s) + if len(domains) == len(s) { // No leading space?! - return nil, fmt.Errorf("missing space after \"domain\" in %q", line) + return nil, fmt.Errorf("missing space after \"search\" in %q", line) } - fqdn, err := dnsname.ToFQDN(domain) - if err != nil { - return nil, fmt.Errorf("parsing search domains %q: %w", line, err) + for len(domains) > 0 { + domain := domains + i := strings.IndexAny(domain, " \t") + if i != -1 { + domain = domain[:i] + domains = strings.TrimSpace(domains[i+1:]) + } else { + domains = "" + } + fqdn, err := dnsname.ToFQDN(domain) + if err != nil { + return nil, fmt.Errorf("parsing search domain %q in %q: %w", domain, line, err) + } + config.SearchDomains = append(config.SearchDomains, fqdn) } - config.SearchDomains = append(config.SearchDomains, fqdn) - continue } } return config, nil diff --git a/net/dns/resolvconffile/resolvconffile_test.go b/net/dns/resolvconffile/resolvconffile_test.go index ed9583a09..e5b5cc671 100644 --- a/net/dns/resolvconffile/resolvconffile_test.go +++ b/net/dns/resolvconffile/resolvconffile_test.go @@ -57,6 +57,31 @@ func TestParse(t *testing.T) { }, {in: `searchtailsacle.com`, wantErr: true}, {in: `search`, wantErr: true}, + + // Issue 6875: there can be multiple search domains, and even if they're + // over 253 bytes long total. + { + in: "search search-01.example search-02.example search-03.example search-04.example search-05.example search-06.example search-07.example search-08.example search-09.example search-10.example search-11.example search-12.example search-13.example search-14.example search-15.example\n", + want: &Config{ + SearchDomains: []dnsname.FQDN{ + "search-01.example.", + "search-02.example.", + "search-03.example.", + "search-04.example.", + "search-05.example.", + "search-06.example.", + "search-07.example.", + "search-08.example.", + "search-09.example.", + "search-10.example.", + "search-11.example.", + "search-12.example.", + "search-13.example.", + "search-14.example.", + "search-15.example.", + }, + }, + }, } for _, tt := range tests {