net: properly wrap error and return DNSError consistently

This commit is contained in:
Mateusz Poliwczak 2025-02-25 09:04:14 +01:00
parent bdcd6d1b65
commit 4671f338c9
4 changed files with 21 additions and 63 deletions

View file

@ -47,11 +47,7 @@ func (eai addrinfoErrno) isAddrinfoErrno() {}
func doBlockingWithCtx[T any](ctx context.Context, lookupName string, blocking func() (T, error)) (T, error) {
if err := acquireThread(ctx); err != nil {
var zero T
return zero, &DNSError{
Name: lookupName,
Err: mapErr(err).Error(),
IsTimeout: err == context.DeadlineExceeded,
}
return zero, newDNSError(mapErr(err), lookupName, "")
}
if ctx.Done() == nil {
@ -77,11 +73,7 @@ func doBlockingWithCtx[T any](ctx context.Context, lookupName string, blocking f
return r.res, r.err
case <-ctx.Done():
var zero T
return zero, &DNSError{
Name: lookupName,
Err: mapErr(ctx.Err()).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return zero, newDNSError(mapErr(ctx.Err()), lookupName, "")
}
}

View file

@ -10,6 +10,7 @@ import (
"internal/itoa"
"io/fs"
"os"
"strconv"
"syscall"
)
@ -128,6 +129,7 @@ func startPlan9(ctx context.Context, net string, addr Addr) (ctl *os.File, dest,
clone, dest, err := queryCS1(ctx, proto, ip, port)
if err != nil {
err = handlePlan9DNSError(err, net+":"+ip.String()+":"+strconv.Itoa(port))
return
}
f, err := os.OpenFile(clone, os.O_RDWR, 0)

View file

@ -65,11 +65,7 @@ func query(ctx context.Context, filename, query string, bufSize int) (addrs []st
case r := <-ch:
return r.addrs, r.err
case <-ctx.Done():
return nil, &DNSError{
Name: query,
Err: ctx.Err().Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return nil, mapErr(err)
}
}
@ -143,7 +139,7 @@ func toLower(in string) string {
func lookupProtocol(ctx context.Context, name string) (proto int, err error) {
lines, err := query(ctx, netdir+"/cs", "!protocol="+toLower(name), 128)
if err != nil {
return 0, err
return 0, newDNSError(err, name, "")
}
if len(lines) == 0 {
return 0, UnknownNetworkError(name)
@ -229,16 +225,16 @@ func (*Resolver) lookupPortWithNetwork(ctx context.Context, network, errNetwork,
lines, err := queryCS(ctx, network, "127.0.0.1", toLower(service))
if err != nil {
if stringslite.HasSuffix(err.Error(), "can't translate service") {
return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
return
return 0, newDNSError(err, errNetwork+"/"+service, "")
}
if len(lines) == 0 {
return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
f := getFields(lines[0])
if len(f) < 2 {
return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
s := f[1]
if i := bytealg.IndexByteString(s, '!'); i >= 0 {
@ -247,7 +243,7 @@ func (*Resolver) lookupPortWithNetwork(ctx context.Context, network, errNetwork,
if n, _, ok := dtoi(s); ok {
return n, nil
}
return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true}
return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
}
func (r *Resolver) lookupCNAME(ctx context.Context, name string) (cname string, err error) {
@ -269,7 +265,7 @@ func (r *Resolver) lookupCNAME(ctx context.Context, name string) (cname string,
return f[2] + ".", nil
}
}
return "", errors.New("bad response from ndb/dns")
return "", &DNSError{Err: "bad response from ndb/dns", Name: name}
}
func (r *Resolver) lookupSRV(ctx context.Context, service, proto, name string) (cname string, addrs []*SRV, err error) {

View file

@ -77,7 +77,7 @@ func lookupProtocol(ctx context.Context, name string) (int, error) {
}
return r.proto, r.err
case <-ctx.Done():
return 0, mapErr(ctx.Err())
return 0, newDNSError(mapErr(ctx.Err()), name, "")
}
}
@ -110,11 +110,7 @@ func (r *Resolver) lookupIP(ctx context.Context, network, name string) ([]IPAddr
getaddr := func() ([]IPAddr, error) {
if err := acquireThread(ctx); err != nil {
return nil, &DNSError{
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
hints := syscall.AddrinfoW{
@ -197,11 +193,7 @@ func (r *Resolver) lookupPort(ctx context.Context, network, service string) (int
// TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil {
return 0, &DNSError{
Name: network + "/" + service,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return 0, newDNSError(mapErr(err), network+"/"+service, "")
}
defer releaseThread()
@ -265,11 +257,7 @@ func (r *Resolver) lookupCNAME(ctx context.Context, name string) (string, error)
// TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil {
return "", &DNSError{
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return "", newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
@ -295,11 +283,7 @@ func (r *Resolver) lookupSRV(ctx context.Context, service, proto, name string) (
}
// TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil {
return "", nil, &DNSError{
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return "", nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var target string
@ -330,11 +314,7 @@ func (r *Resolver) lookupMX(ctx context.Context, name string) ([]*MX, error) {
}
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
return nil, &DNSError{
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
@ -359,11 +339,7 @@ func (r *Resolver) lookupNS(ctx context.Context, name string) ([]*NS, error) {
}
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
return nil, &DNSError{
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
@ -387,11 +363,7 @@ func (r *Resolver) lookupTXT(ctx context.Context, name string) ([]string, error)
}
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
return nil, &DNSError{
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return nil, newDNSError(mapErr(err), name, "")
}
defer releaseThread()
var rec *syscall.DNSRecord
@ -420,11 +392,7 @@ func (r *Resolver) lookupAddr(ctx context.Context, addr string) ([]string, error
// TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil {
return nil, &DNSError{
Name: addr,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
return nil, newDNSError(mapErr(err), addr, "")
}
defer releaseThread()
arpa, err := reverseaddr(addr)