]> Cypherpunks repositories - gostls13.git/commitdiff
net: fall back to hosts file if DNS lookup fails, despite order
authorBenjamin Prosnitz <bprosnitz@google.com>
Mon, 30 Nov 2015 05:08:46 +0000 (13:08 +0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Wed, 2 Dec 2015 00:15:41 +0000 (00:15 +0000)
Fixes #13090

Change-Id: I5612d792dabdff89bd0cec57dc2cacf9be7ebf64
Reviewed-on: https://go-review.googlesource.com/16341
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/net/dnsclient_unix.go
src/net/dnsclient_unix_test.go

index ffea828c32c801f41127d8fb065e3baa3e2cb716..5e963d27cc37e7d779b38fa7940286f0b2a6abd1 100644 (file)
@@ -473,12 +473,12 @@ func goLookupIPOrder(name string, order hostLookupOrder) (addrs []IPAddr, err er
        }
        sortByRFC6724(addrs)
        if len(addrs) == 0 {
-               if lastErr != nil {
-                       return nil, lastErr
-               }
                if order == hostLookupDNSFiles {
                        addrs = goLookupIPFiles(name)
                }
+               if lastErr != nil {
+                       return nil, lastErr
+               }
        }
        return addrs, nil
 }
index a999f8f060726b17e268ae1ca7ce90735386b258..a54f7b898d9545055177984f913a7b4219bcebac 100644 (file)
@@ -378,6 +378,48 @@ func TestGoLookupIPWithResolverConfig(t *testing.T) {
        }
 }
 
+// Test that goLookupIPOrder falls back to the host file when no DNS servers are available.
+func TestGoLookupIPOrderFallbackToFile(t *testing.T) {
+       if testing.Short() || !*testExternal {
+               t.Skip("avoid external network")
+       }
+
+       // Add a config that simulates no dns servers being available.
+       conf, err := newResolvConfTest()
+       if err != nil {
+               t.Fatal(err)
+       }
+       if err := conf.writeAndUpdate([]string{}); err != nil {
+               t.Fatal(err)
+       }
+       conf.tryUpdate(conf.path)
+       // Redirect host file lookups.
+       defer func(orig string) { testHookHostsPath = orig }(testHookHostsPath)
+       testHookHostsPath = "testdata/hosts"
+
+       for _, order := range []hostLookupOrder{hostLookupFilesDNS, hostLookupDNSFiles} {
+               name := fmt.Sprintf("order %v", order)
+
+               // First ensure that we get an error when contacting a non-existant host.
+               _, err := goLookupIPOrder("notarealhost", order)
+               if err == nil {
+                       t.Errorf("%s: expected error while looking up name not in hosts file", name)
+                       continue
+               }
+
+               // Now check that we get an address when the name appears in the hosts file.
+               addrs, err := goLookupIPOrder("thor", order) // entry is in "testdata/hosts"
+               if err != nil {
+                       t.Errorf("%s: expected to successfully lookup host entry", name)
+                       continue
+               }
+               if got, want := addrs, []IPAddr{IPAddr{IP: IP{127, 0, 0, 1}}}; !reflect.DeepEqual(got, want) {
+                       t.Errorf("%s: address doesn't match expectation. got %v, want %v", name, got, want)
+               }
+       }
+       defer conf.teardown()
+}
+
 func BenchmarkGoLookupIP(b *testing.B) {
        testHookUninstaller.Do(uninstallTestHooks)