Skip to content

Commit f18cf88

Browse files
committed
netstack/icmp: avoid short-curcuit; pkt may be empty
1 parent ec5d56d commit f18cf88

File tree

2 files changed

+13
-22
lines changed

2 files changed

+13
-22
lines changed

intra/netstack/icmpecho.go

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,6 @@ func (r *icmpResponder) respond(pkt *stack.PacketBuffer) (handled bool) {
6868
log.E("icmp: responder: no handler")
6969
return
7070
}
71-
if useIcmpForwarder {
72-
var id stack.TransportEndpointID
73-
id.LocalAddress = pkt.Network().SourceAddress()
74-
id.RemoteAddress = pkt.Network().DestinationAddress()
75-
if settings.Debug {
76-
log.VV("icmp: responder: forward (sz: %d); src %s => dst %s",
77-
pkt.Size(), id.RemoteAddress, id.LocalAddress)
78-
}
79-
return icmpForward2(h, pkt, id)
80-
}
8171
return r.handle(h, pkt.NICID, pkt)
8272
}
8373

@@ -217,7 +207,7 @@ func (r *icmpResponder) process(h *icmpForwarder, nic tcpip.NICID, pkt *wire.Par
217207

218208
pinged := h.h.Ping(icmpMsg, src, dst)
219209

220-
resp, proto, tag, err := r.echoReply(pkt, payload, pinged)
210+
resp, proto, l4proto, tag, err := r.echoReply(pkt, payload, pinged)
221211
notok = err != nil || len(resp) == 0
222212

223213
if notok || settings.Debug {
@@ -229,10 +219,10 @@ func (r *icmpResponder) process(h *icmpForwarder, nic tcpip.NICID, pkt *wire.Par
229219
return
230220
}
231221

232-
r.inject(nic, proto, resp)
222+
r.inject(nic, proto, l4proto, resp)
233223
}
234224

235-
func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte, tcpip.NetworkProtocolNumber, string, error) {
225+
func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte, tcpip.NetworkProtocolNumber, tcpip.TransportProtocolNumber, string, error) {
236226
// github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/netstack/netstack.go#L1201-L1212
237227
switch pkt.IPVersion {
238228
case 4:
@@ -243,7 +233,7 @@ func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte,
243233
(&icmpHdr).Code = wire.ICMP4HostUnreachable
244234
}
245235
tag := icmpHdr.Stringer()
246-
return wire.Generate(&icmpHdr, d), header.IPv4ProtocolNumber, tag, nil
236+
return wire.Generate(&icmpHdr, d), header.IPv4ProtocolNumber, header.ICMPv4ProtocolNumber, tag, nil
247237
case 6:
248238
icmpHdr := pkt.ICMP6Header()
249239
(&icmpHdr).ToResponse()
@@ -253,13 +243,13 @@ func (r *icmpResponder) echoReply(pkt *wire.Parsed, d []byte, ok bool) ([]byte,
253243
}
254244
tag := icmpHdr.Stringer()
255245
// github.com/tailscale/tailscale/blob/7de1b0b33082cc/wgengine/userspace.go#L577
256-
return wire.Generate(&icmpHdr, d), header.IPv6ProtocolNumber, tag, nil
246+
return wire.Generate(&icmpHdr, d), header.IPv6ProtocolNumber, header.ICMPv6ProtocolNumber, tag, nil
257247
default:
258-
return nil, 0, "<nil>", fmt.Errorf("unsupported ip version: %d", pkt.IPVersion)
248+
return nil, 0, 0, "<nil>", fmt.Errorf("unsupported ip version: %d", pkt.IPVersion)
259249
}
260250
}
261251

262-
func (r *icmpResponder) inject(nic tcpip.NICID, proto tcpip.NetworkProtocolNumber, packet []byte) {
252+
func (r *icmpResponder) inject(nic tcpip.NICID, proto tcpip.NetworkProtocolNumber, l4proto tcpip.TransportProtocolNumber, packet []byte) {
263253
ep := r.ep
264254
if ep == nil || !r.ok() {
265255
return
@@ -269,11 +259,12 @@ func (r *icmpResponder) inject(nic tcpip.NICID, proto tcpip.NetworkProtocolNumbe
269259
Payload: buffer.MakeWithData(packet),
270260
})
271261
pkt.NICID = nic
272-
defer pkt.DecRef()
273-
274262
pkt.NetworkProtocolNumber = proto
263+
pkt.TransportProtocolNumber = l4proto
264+
275265
var list stack.PacketBufferList
276266
list.PushBack(pkt)
267+
defer list.DecRef()
277268

278269
sz := pkt.Size()
279270
n, err := ep.WritePackets(list)

intra/netstack/rev.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ func NewReverseGConnHandler(pctx context.Context, to *stack.Stack, of tcpip.NICI
7373
udp: newReverseUDP(id, to, of, ifaddrs, via.UDP()),
7474
icmp: newReverseICMP(id, to, ep, via.ICMP()),
7575
}
76-
log.I("rev: %s: newReverseGConnHandler %d @ %d on %s", id, of, core.Loc(to), ifaddrs)
76+
log.I("rev: %s: newReverseGConnHandler %d @ %d on %v", id, of, core.Loc(to), ifaddrs)
7777
context.AfterFunc(pctx, h.end)
7878
return h
7979
}
8080

8181
func newReverseTCP(id string, s *stack.Stack, nic tcpip.NICID, ifaddrs revip, h GTCPConnHandler) *revtcp {
82-
log.I("rev: %s: nic %d newReverseTCP %s", id, nic, ifaddrs)
82+
log.I("rev: %s: nic %d newReverseTCP %v", id, nic, ifaddrs)
8383
return &revtcp{
8484
revbase: &revbase[*GTCPConn]{o: id},
8585
revip: ifaddrs,
@@ -89,7 +89,7 @@ func newReverseTCP(id string, s *stack.Stack, nic tcpip.NICID, ifaddrs revip, h
8989
}
9090

9191
func newReverseUDP(id string, s *stack.Stack, nic tcpip.NICID, ifaddrs revip, h GUDPConnHandler) *revudp {
92-
log.I("rev: %s: nic %d newReverseUDP %s", id, nic, ifaddrs)
92+
log.I("rev: %s: nic %d newReverseUDP %v", id, nic, ifaddrs)
9393
return &revudp{
9494
revbase: &revbase[*GUDPConn]{o: id},
9595
revip: ifaddrs,

0 commit comments

Comments
 (0)