Commit 23996681 authored by Mikio Hara's avatar Mikio Hara

icmp: prevent stripping off ipv4 header twice on darwin

We cannot use net.ReadFrom on darwin because a) net.ReadFrom and
net.ReadFromIP unconditionally try to strip off ipv4 header due to
and c) icmp.ListenPacket calls ipv4.PacketConn internally.

Instead, we use ipv4.PacketConn.ReadFrom that calls net.ReadMsgIP
internally to prevent icmp.ReadFrom from returning corrupted ICMP
message.

Fixes #9395.

Change-Id: I269f3724de72bf37eb26921c251c2acb1c720fa3
parent b1ee7b3f
...@@ -6,6 +6,7 @@ package icmp ...@@ -6,6 +6,7 @@ package icmp
import ( import (
"net" "net"
"runtime"
"syscall" "syscall"
"time" "time"
...@@ -51,6 +52,15 @@ func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { ...@@ -51,6 +52,15 @@ func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) {
if !c.ok() { if !c.ok() {
return 0, nil, syscall.EINVAL return 0, nil, syscall.EINVAL
} }
// Please be informed that ipv4.NewPacketConn enables
// IP_STRIPHDR option by default on Darwin.
// See golang.org/issue/9395 for futher information.
if runtime.GOOS == "darwin" {
if p, _ := c.ipc.(*ipv4.PacketConn); p != nil {
n, _, peer, err := p.ReadFrom(b)
return n, peer, err
}
}
return c.c.ReadFrom(b) return c.c.ReadFrom(b)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment