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

View file

@ -10,6 +10,7 @@ import (
"internal/itoa" "internal/itoa"
"io/fs" "io/fs"
"os" "os"
"strconv"
"syscall" "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) clone, dest, err := queryCS1(ctx, proto, ip, port)
if err != nil { if err != nil {
err = handlePlan9DNSError(err, net+":"+ip.String()+":"+strconv.Itoa(port))
return return
} }
f, err := os.OpenFile(clone, os.O_RDWR, 0) 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: case r := <-ch:
return r.addrs, r.err return r.addrs, r.err
case <-ctx.Done(): case <-ctx.Done():
return nil, &DNSError{ return nil, mapErr(err)
Name: query,
Err: ctx.Err().Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
} }
@ -143,7 +139,7 @@ func toLower(in string) string {
func lookupProtocol(ctx context.Context, name string) (proto int, err error) { func lookupProtocol(ctx context.Context, name string) (proto int, err error) {
lines, err := query(ctx, netdir+"/cs", "!protocol="+toLower(name), 128) lines, err := query(ctx, netdir+"/cs", "!protocol="+toLower(name), 128)
if err != nil { if err != nil {
return 0, err return 0, newDNSError(err, name, "")
} }
if len(lines) == 0 { if len(lines) == 0 {
return 0, UnknownNetworkError(name) 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)) lines, err := queryCS(ctx, network, "127.0.0.1", toLower(service))
if err != nil { if err != nil {
if stringslite.HasSuffix(err.Error(), "can't translate service") { 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 { 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]) f := getFields(lines[0])
if len(f) < 2 { if len(f) < 2 {
return 0, &DNSError{Err: "unknown port", Name: errNetwork + "/" + service, IsNotFound: true} return 0, newDNSError(errUnknownPort, errNetwork+"/"+service, "")
} }
s := f[1] s := f[1]
if i := bytealg.IndexByteString(s, '!'); i >= 0 { 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 { if n, _, ok := dtoi(s); ok {
return n, nil 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) { 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 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) { 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 return r.proto, r.err
case <-ctx.Done(): 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) { getaddr := func() ([]IPAddr, error) {
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return nil, &DNSError{ return nil, newDNSError(mapErr(err), name, "")
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
hints := syscall.AddrinfoW{ hints := syscall.AddrinfoW{
@ -197,11 +193,7 @@ func (r *Resolver) lookupPort(ctx context.Context, network, service string) (int
// TODO(bradfitz): finish ctx plumbing // TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return 0, &DNSError{ return 0, newDNSError(mapErr(err), network+"/"+service, "")
Name: network + "/" + service,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
@ -265,11 +257,7 @@ func (r *Resolver) lookupCNAME(ctx context.Context, name string) (string, error)
// TODO(bradfitz): finish ctx plumbing // TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return "", &DNSError{ return "", newDNSError(mapErr(err), name, "")
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
var rec *syscall.DNSRecord var rec *syscall.DNSRecord
@ -295,11 +283,7 @@ func (r *Resolver) lookupSRV(ctx context.Context, service, proto, name string) (
} }
// TODO(bradfitz): finish ctx plumbing // TODO(bradfitz): finish ctx plumbing
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return "", nil, &DNSError{ return "", nil, newDNSError(mapErr(err), name, "")
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
var target string var target string
@ -330,11 +314,7 @@ func (r *Resolver) lookupMX(ctx context.Context, name string) ([]*MX, error) {
} }
// TODO(bradfitz): finish ctx plumbing. // TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return nil, &DNSError{ return nil, newDNSError(mapErr(err), name, "")
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
var rec *syscall.DNSRecord var rec *syscall.DNSRecord
@ -359,11 +339,7 @@ func (r *Resolver) lookupNS(ctx context.Context, name string) ([]*NS, error) {
} }
// TODO(bradfitz): finish ctx plumbing. // TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return nil, &DNSError{ return nil, newDNSError(mapErr(err), name, "")
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
var rec *syscall.DNSRecord var rec *syscall.DNSRecord
@ -387,11 +363,7 @@ func (r *Resolver) lookupTXT(ctx context.Context, name string) ([]string, error)
} }
// TODO(bradfitz): finish ctx plumbing. // TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return nil, &DNSError{ return nil, newDNSError(mapErr(err), name, "")
Name: name,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
var rec *syscall.DNSRecord var rec *syscall.DNSRecord
@ -420,11 +392,7 @@ func (r *Resolver) lookupAddr(ctx context.Context, addr string) ([]string, error
// TODO(bradfitz): finish ctx plumbing. // TODO(bradfitz): finish ctx plumbing.
if err := acquireThread(ctx); err != nil { if err := acquireThread(ctx); err != nil {
return nil, &DNSError{ return nil, newDNSError(mapErr(err), addr, "")
Name: addr,
Err: mapErr(err).Error(),
IsTimeout: ctx.Err() == context.DeadlineExceeded,
}
} }
defer releaseThread() defer releaseThread()
arpa, err := reverseaddr(addr) arpa, err := reverseaddr(addr)