Skip to content

Commit

Permalink
udp: unconditionally close conns on errors
Browse files Browse the repository at this point in the history
  • Loading branch information
ignoramous committed Jan 29, 2025
1 parent f7f1e70 commit 0715d4a
Showing 1 changed file with 12 additions and 8 deletions.
20 changes: 12 additions & 8 deletions intra/udp.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ var (
errIcmpFirewalled = errors.New("icmp: firewalled")
errUdpFirewalled = errors.New("udp: firewalled")
errUdpInFirewalled = errors.New("udp: ingress firewalled")
errUdpInEstErr = errors.New("udp: ingress establish error")
errUdpSetupConn = errors.New("udp: could not create conn")
errProxyMismatch = errors.New("udp: proxy mismatch")
errUidMismatch = errors.New("udp: uid mismatch")
Expand Down Expand Up @@ -109,16 +110,17 @@ func (h *udpHandler) ReverseProxy(gconn *netstack.GUDPConn, in net.Conn, to, fro
cid, uid, _, pids := h.judge(fm)
smm := udpSummary(cid, uid, from.Addr())
if isAnyBlockPid(pids) {
log.I("udp: %s reverse: block %s -> %s", cid, from, to)
clos(gconn, in)
log.I("udp: %s reverse: block %s => %s", cid, from, to)
clos(gconn, in) // blocked
h.queueSummary(smm.done(errUdpInFirewalled))
return true
return true // ok
} // else: pid should only be ipn.Ingress

if err := gconn.Establish(); err != nil { // gconn.Establish() failed
log.W("udp: %s reverse: %s gconn.Est, err %s => %s", cid, to, from, err)
h.queueSummary(smm.done(errUdpInFirewalled))
return false
clos(gconn, in) // teardown
h.queueSummary(smm.done(errUdpInEstErr))
return false // not ok
}

core.Go("udp.reverse:"+cid, func() {
Expand All @@ -136,7 +138,9 @@ func (h *udpHandler) ProxyMux(gconn *netstack.GUDPConn, src, dst netip.AddrPort,
// Error implements netstack.GUDPConnHandler.
// Must be called from a goroutine.
func (h *udpHandler) Error(gconn *netstack.GUDPConn, src, target netip.AddrPort, err error) {
log.W("udp: proxy: %v -> %v; err %v", src, target, err)
defer clos(gconn) // if open

log.W("udp: proxy: %v => %v; err %v", src, target, err)
if !src.IsValid() || !target.IsValid() {
return
}
Expand All @@ -163,7 +167,7 @@ func (h *udpHandler) proxy(gconn *netstack.GUDPConn, src, dst netip.AddrPort, dm
remote, smm, err := h.Connect(gconn, src, dst, dmx)

if err != nil {
clos(gconn, remote)
clos(gconn, remote) // teardown
// smm may be nil; in which case this is a no-op
h.queueSummary(smm.done(err))
return false // not ok
Expand Down Expand Up @@ -328,7 +332,7 @@ func (h *udpHandler) Connect(gconn *netstack.GUDPConn, src, target netip.AddrPor
return nil, smm, errUdpSetupConn // disconnect
}

log.I("udp: connect: %s (proxy? %s@%s) %v -> %s/%s; mux? %t, uid %s",
log.I("udp: connect: %s (proxy? %s@%s) %v => %s/%s; mux? %t, uid %s",
cid, px.ID(), px.GetAddr(), laddr, target, selectedTarget, mux, uid)

return pc, smm, nil // connect
Expand Down

1 comment on commit 0715d4a

@ignoramous
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.