Skip to content

Commit 0dc35ce

Browse files
Lanius-collarisignoramous
authored andcommitted
icmp: fix reply4()
1 parent dfb696c commit 0dc35ce

File tree

1 file changed

+12
-24
lines changed

1 file changed

+12
-24
lines changed

intra/netstack/icmp.go

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -117,41 +117,29 @@ func (f *icmpForwarder) reply4(id stack.TransportEndpointID, pkt *stack.PacketBu
117117
if !f.h.Ping(data, src, dst) { // unreachable
118118
err = f.icmpErr4(pkt, header.ICMPv4DstUnreachable, header.ICMPv4HostUnreachable)
119119
} else { // reachable
120-
newOptions := f.ipOpts(pkt, ipHdr)
121-
122-
// Correct IP header length (IHL in 32-bit words).
123-
replyHeaderLength := uint8(header.IPv4MinimumSize + len(newOptions))
124-
replyIPHdrView := buffer.NewView(int(replyHeaderLength))
125-
replyIPHdrView.Write(ipHdr[:header.IPv4MinimumSize])
126-
replyIPHdrView.Write(newOptions)
127-
128-
replyIPHdr := header.IPv4(replyIPHdrView.AsSlice())
129-
replyIPHdr.SetHeaderLength(replyHeaderLength >> 2) // IHL in 32-bit words.
130-
replyIPHdr.SetSourceAddress(route.LocalAddress())
131-
replyIPHdr.SetDestinationAddress(route.RemoteAddress())
132-
replyIPHdr.SetTTL(route.DefaultTTL())
133-
replyIPHdr.SetTotalLength(uint16(len(replyIPHdr) + len(replyData.AsSlice())))
134-
replyIPHdr.SetChecksum(0)
135-
replyIPHdr.SetChecksum(^replyIPHdr.CalculateChecksum())
136-
137-
replyICMPHdr := header.ICMPv4(replyData.AsSlice())
120+
originRef := replyData.AsSlice()
121+
replyBuf := buffer.NewViewSize(len(originRef))
122+
replyRef := replyBuf.AsSlice()
123+
124+
copy(replyRef[4:], originRef[4:])
125+
replyICMPHdr := header.ICMPv4(replyRef)
138126
replyICMPHdr.SetType(header.ICMPv4EchoReply)
139127
replyICMPHdr.SetCode(0) // EchoReply must have Code=0.
140-
replyICMPHdr.SetChecksum(0)
141-
replyICMPHdr.SetChecksum(^checksum.Checksum(replyData.AsSlice(), 0))
128+
replyICMPHdr.SetChecksum(^checksum.Checksum(replyRef, 0))
142129

143-
replyBuf := buffer.MakeWithView(replyIPHdrView)
144-
replyBuf.Append(replyData.Clone())
145130
replyPkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
146131
ReserveHeaderBytes: int(route.MaxHeaderLength()),
147-
Payload: replyBuf,
132+
Payload: buffer.MakeWithView(replyBuf),
148133
})
149134

150135
log.D("icmp: v4: %s: ok type %v/%v sz[%d] from %v <= %v",
151136
f.o, replyICMPHdr.Type(), replyICMPHdr.Code(), len(replyICMPHdr), src, dst)
152137

153138
// github.com/google/gvisor/blob/738e1d995f/pkg/tcpip/network/ipv4/icmp.go#L794
154-
err = route.WriteHeaderIncludedPacket(replyPkt)
139+
err = route.WritePacket(stack.NetworkHeaderParams{
140+
Protocol: header.ICMPv4ProtocolNumber,
141+
TTL: route.DefaultTTL(),
142+
}, replyPkt)
155143
}
156144
loge(err)("icmp: v4: %s: wrote reply to tun; err? %v", f.o, err)
157145
})

0 commit comments

Comments
 (0)