diff --git a/go.mod b/go.mod index 2d5f932a16..e6b4832439 100644 --- a/go.mod +++ b/go.mod @@ -50,11 +50,11 @@ require ( github.com/ziutek/mymysql v1.5.4 // indirect gitlab.com/yawning/obfs4.git v0.0.0-20210511220700-e330d1b7024b gitlab.com/yawning/utls.git v0.0.12-1 - golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce + golang.org/x/crypto v0.0.0-20220112180741-5e0467b6c7ce // indirect golang.org/x/net v0.0.0-20220114011407-0dd24b26b47d - golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 + golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect - golang.org/x/tools v0.1.8 // indirect + golang.org/x/tools v0.1.9 // indirect gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect upper.io/db.v3 v3.8.0+incompatible ) diff --git a/go.sum b/go.sum index 604772f9c5..b9028ec727 100644 --- a/go.sum +++ b/go.sum @@ -973,8 +973,8 @@ golang.org/x/sys v0.0.0-20210915083310-ed5796bab164/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8pY/4yfcXrddB8qAbU0= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c h1:sSIdNI2Dd6vGv47bKc/xArpfxVmEz2+3j0E6I484xC4= +golang.org/x/sys v0.0.0-20220222200937-f2425489ef4c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= @@ -1016,8 +1016,8 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.8 h1:P1HhGGuLW4aAclzjtmJdf0mJOjVUZUzOTqkAkWL+l6w= -golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= +golang.org/x/tools v0.1.9 h1:j9KsMiaP1c3B0OTQGth0/k+miLGTgLsAFUCrF2vLcF8= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/netxlite/classify.go b/internal/netxlite/classify.go index 4e0b1b2370..e51d5a7a7f 100644 --- a/internal/netxlite/classify.go +++ b/internal/netxlite/classify.go @@ -5,6 +5,7 @@ import ( "crypto/x509" "errors" "fmt" + "runtime" "strings" "github.com/lucas-clemente/quic-go" @@ -64,6 +65,14 @@ func classifyGenericError(err error) string { return scrubber.Scrub(formatted) // scrub IP addresses in the error } +// This suffix is returned on (some?) Android devices where getaddrinfo seems +// to return EAI_NODATA instead of EAI_NONAME for NXDOMAIN conditions. We handle +// this specific string to correctly route the error as an hotfix for just the +// release/3.14 branch, while a more comprehensive fix will land in release/3.15. +// +// See https://github.com/ooni/probe/issues/2029. +const dnsAndroidEAINODATASuffix = "No address associated with hostname" + // classifyWithStringSuffix is a subset of ClassifyGenericError that // performs classification by looking at error suffixes. This function // will return an empty string if it cannot classify the error. @@ -87,6 +96,17 @@ func classifyWithStringSuffix(err error) string { if strings.HasSuffix(s, "TLS handshake timeout") { return FailureGenericTimeoutError } + if runtime.GOOS == "android" && strings.HasSuffix(s, dnsAndroidEAINODATASuffix) { + // Because this is a release hotfix, here we're going to apply + // the simplest fix and just consider EAI_NODATA to be same + // as NXDOMAIN, even though this is probably not the most correct + // mapping to apply. We're not going to merge this diff into + // master, thus it's okay to have this simplistic fix here while + // we work on a more comprehensive solution. + // + // See https://github.com/ooni/probe/issues/2029. + return FailureDNSNXDOMAINError + } if strings.HasSuffix(s, DNSNoSuchHostSuffix) { // This is dns_lookup_error in MK but such error is used as a // generic "hey, the lookup failed" error. Instead, this error