Files
Zakk ad509ce51b fix(service): the confirmed findings of four independent backend scans
A custom latency test URL that http.NewRequest rejects made a spawned
goroutine dereference nil and exit the process; the URL is validated
before any goroutine starts and the request error is handled. A
Shadowsocks link whose plugin field has no ";" panicked the parser, and
from the automatic subscription update that goroutine was unrecovered;
the parser accepts it and each updater recovers and logs.

The DNS module took the last non-bootstrap upstream as the fallback
while the template emitted upstreams in rule order with deduplication,
so a catch-all rule anywhere but last, or one whose upstream was
deduplicated, was not the fallback. The template names the fallback in
a new default_upstream field and the module honours it.

PUT /routingA stored the rules without regenerating the running core.
It goes through ApplyCoreConfig like the other config writers, with
restore on failure. UpdateSubscription logged a failed core reload and
answered success; it returns the error. PATCH /subscription joins the
mutation turn.

Subscription fetching retried through a direct connection when the
selected proxy failed, leaking the subscription URL; it returns the
error. Subscription documents are capped at 32 MiB and downloaded
assets at 256 MiB. PUT /gfwList validates the downloaded file as a
geosite list before replacing the working one.

The login handler took its one-at-a-time semaphore before reading the
body, so a client sending headers and no body blocked every login; the
body is read first and the HTTP server has header and idle timeouts.

Share links: a VLESS or VMess link without a numeric port is rejected
at parse time instead of producing port 0; an SSR link with a password
that is not base64 is rejected instead of importing empty; the SIP003
path gets its leading slash prepended, not a trailing one appended.

The macOS system proxy quoted shell arguments with strconv.Quote,
which leaves $(...) live; values are single-quoted. The Windows system
proxy snapshot includes AutoConfigURL, which teardown deleted and never
restored. Latency test responses with a non-2xx status are closed. The
version response carries the docker flag the GUI's port hints read.
2026-09-20 09:59:29 +10:00

24 lines
767 B
Go

package dns
import "testing"
func TestConfiguredDefaultUpstreamRoutesUnmatchedQuery(t *testing.T) {
config := &DnsModuleConfig{
DefaultUpstream: "first",
Upstreams: []UpstreamConfig{
{ID: "first", Addr: "1.1.1.1:53"},
{ID: "last", Addr: "8.8.8.8:53"},
},
Rules: []RuleConfig{{ID: "specific", Domain: []string{"example.com"}, Upstream: "last"}},
}
rules := []*DnsRule{{ID: "specific", Domain: []string{"example.com"}, Upstream: "last"}}
router, err := NewRouter(rules, config.Upstreams, selectDefaultUpstream(config))
if err != nil {
t.Fatal(err)
}
got := router.Route(&DnsQuery{Name: "unmatched.test", QType: TypeA})
if got.UpstreamID != "first" || got.UpstreamAddr != "1.1.1.1:53" {
t.Fatalf("route = %+v, want first upstream", got)
}
}