{"record":{"id":"2cacac50ca2ccd32","repo":"owasp-amass/amass","slug":"name-does-not-exist","errorCode":null,"errorMessage":"name does not exist","messagePattern":"name does not exist","errorType":"error_code","errorClass":"ErrNameDoesNotExist","httpStatus":null,"severity":"info","filePath":"engine/plugins/support/resolvers.go","lineNumber":26,"sourceCode":"\t\"context\"\n\t\"errors\"\n\t\"runtime\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/miekg/dns\"\n\t\"github.com/owasp-amass/resolve/conn\"\n\t\"github.com/owasp-amass/resolve/pool\"\n\t\"github.com/owasp-amass/resolve/selectors\"\n\t\"github.com/owasp-amass/resolve/servers\"\n\t\"github.com/owasp-amass/resolve/types\"\n\t\"github.com/owasp-amass/resolve/utils\"\n\t\"github.com/owasp-amass/resolve/wildcards\"\n\t\"golang.org/x/net/publicsuffix\"\n)\n\nvar (\n\tErrNameDoesNotExist     = errors.New(\"name does not exist\")\n\tErrNoRecordOfThisType   = errors.New(\"no record of this type\")\n\tErrFailedMaxDNSAttempts = errors.New(\"failed the maximum number of DNS attempts\")\n)\n\ntype baseline struct {\n\taddress string\n\tqps     int\n}\n\n// baselineResolvers is a list of trusted public DNS resolvers.\nvar baselineResolvers = []baseline{\n\t{\"8.8.8.8\", 5}, // Google Primary\n\t//\t{\"8.8.4.4\", 5},         // Google Secondary\n\t{\"95.85.95.85\", 2},     // Gcore DNS Primary\n\t{\"2.56.220.2\", 2},      // Gcore DNS Secondary\n\t{\"76.76.2.0\", 2},       // ControlD Primary\n\t{\"76.76.10.0\", 2},      // ControlD Secondary\n\t{\"9.9.9.9\", 2},         // Quad9 Primary","sourceCodeStart":8,"sourceCodeEnd":44,"githubUrl":"https://github.com/owasp-amass/amass/blob/79299dce87b0085db0f2f4ef3e9c52cccb49f514/engine/plugins/support/resolvers.go#L8-L44","documentation":"ErrNameDoesNotExist is a sentinel error returned by the DNS resolution pipeline (dnsQuery and PerformQuery) in engine/plugins/support/resolvers.go when an authoritative DNS server answers with RcodeNameError (NXDOMAIN). It signals the queried domain name simply does not exist in DNS, so no further record lookups for it can succeed. PerformQuery propagates it (together with ErrNoRecordOfThisType) so callers can distinguish NXDOMAIN from transient lookup failures.","triggerScenarios":"Calling support.PerformQuery(ctx, name, qtype) (or the internal dnsQuery) for a name whose DNS response has Rcode == dns.RcodeNameError, e.g. a subdomain that was never registered or has been deleted.","commonSituations":"Enumerating subdomains of a zone and hitting a non-existent host; a domain expired or was removed between discovery and resolution; typo in the hostname being resolved; wildcard-based discovery emitting names that do not resolve.","solutions":["Treat the name as non-existent: skip it and do not retry, since NXDOMAIN may be cached.","Check the name for typos or stale data before re-adding it to the enumeration queue.","Use errors.Is/== against support.ErrNameDoesNotExist to branch on this case instead of generic error handling.","If the name should exist, verify with an external resolver/dig and check for DNS propagation or zone misconfiguration."],"exampleFix":"// before\nresp, err := support.PerformQuery(ctx, name, dns.TypeA)\nif err != nil {\n    log.Error(err.Error())\n}\n// after\nresp, err := support.PerformQuery(ctx, name, dns.TypeA)\nif err != nil {\n    if err == support.ErrNameDoesNotExist {\n        log.Info(\"name does not exist, skipping\", \"name\", name)\n        return nil\n    }\n    log.Error(err.Error())\n}","handlingStrategy":"try-catch","validationCode":"// Go: check name plausibility before querying\nif name == \"\" || !strings.Contains(name, \".\") {\n    return fmt.Errorf(\"invalid name %q\", name)\n}","typeGuard":"func isNameDoesNotExist(err error) bool { return errors.Is(err, support.ErrNameDoesNotExist) }","tryCatchPattern":"rr, err := support.PerformQuery(ctx, name, dns.TypeA)\nif err != nil {\n    switch {\n    case errors.Is(err, support.ErrNameDoesNotExist):\n        return nil // definitive: skip\n    default:\n        return err\n    }\n}","preventionTips":["Skip NXDOMAIN names permanently instead of requeueing them.","Validate hostnames before submitting them for resolution.","Distinguish NXDOMAIN from transient errors using the sentinel errors.","Remember NXDOMAIN can be cached by resolvers — do not hammer retries."],"tags":["dns","nxdomain","sentinel-error"],"backgroundTag":"record-not-found","analyzedSha":"79299dce87b0085db0f2f4ef3e9c52cccb49f514","analyzedAt":"2026-09-06T08:22:48.198Z","contentChangedAt":"2026-09-06T08:22:48.198Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}