snapshot: sagernet/gvisor v0.0.0-20260727.0-sing-box-mod.1 + SPEC 048 guard

Обновление снапшота с v0.0.0-20250811.0 на пин, которого требует
sing-box после мержа 235 коммитов (upstream d620bbbf2 "Update gvisor to
20260727.0"). Прежний снапшот был взят 2026-08-04 ровно с той версии,
на которой тогда стоял апстрим; разрыв возник 2026-08-05 вместе с его
бампом.

За год апстрим-gvisor изменил ~14 000 строк в 292 файлах. Значимое для
нас — сетевой стек: tcp/connect.go (PMTU-discovery + исправление
начального RTT/RTO: раньше задержка ACK внутри стека завышала стартовый
таймаут на несколько RTT), tcp/snd.go, tcp/rcv.go, stack/conntrack.go,
stack/packet_buffer.go. Всего 30 файлов в TCP и 37 в stack.

Баг SPEC 048 апстрим НЕ исправил — проверено по коду новой версии:
handleConnecting по-прежнему проверяет состояние endpoint'а, но не ep.h,
а performHandshake так же зануляет h и отпускает мьютекс до Close().
Поэтому guard перенесён (12 строк) вместе со своим тестом (45 строк).

Red/green проверен на новой базе: без guard'а тест падает с той же
nil-паникой, что в полевом крашдампе; с ним зелёный.
This commit is contained in:
Leadaxe 2026-08-05 14:53:31 +03:00
parent ffebe42860
commit 117243aa02
293 changed files with 16413 additions and 2842 deletions

303
pkg/abi/linux/ebpf.go Normal file
View file

@ -0,0 +1,303 @@
// Copyright 2026 The gVisor Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package linux
import (
"structs"
"github.com/sagernet/gvisor/pkg/marshal"
)
// EBPFInstruction is the userspace representation of an eBPF instruction that has not
// been validated.
//
// +marshal slice:EBPFInstructionSlice
// +stateify savable
type EBPFInstruction struct {
_ structs.HostLayout
Code uint8
Registers uint8 // LE: 4 LSBs are destination, 4 MSBs are source
Offset int16
Immediate int32
}
// Constants defining eBPF-related limits.
const (
// Maximum instruction count in an eBPF program
BPF_COMPLEXITY_LIMIT_INSNS = 1_000_000
// Maximum length of an eBPF program's name
BPF_OBJ_NAME_LEN = 16
// Size of an EbpfInstruction
BPF_INSTRUCTION_SIZE = 8
// Maximum number of cgroup eBPF programs per attachment type.
BPF_CGROUP_MAX_PROGS = 64
)
// Valid values for `cmd` for bpf(2).
const (
BPF_MAP_CREATE = iota
BPF_MAP_LOOKUP_ELEM
BPF_MAP_UPDATE_ELEM
BPF_MAP_DELETE_ELEM
BPF_MAP_GET_NEXT_KEY
BPF_PROG_LOAD
BPF_OBJ_PIN
BPF_OBJ_GET
BPF_PROG_ATTACH
BPF_PROG_DETACH
BPF_PROG_TEST_RUN
BPF_PROG_GET_NEXT_ID
BPF_MAP_GET_NEXT_ID
BPF_PROG_GET_FD_BY_ID
BPF_MAP_GET_FD_BY_ID
BPF_OBJ_GET_INFO_BY_FD
BPF_PROG_QUERY
BPF_RAW_TRACEPOINT_OPEN
BPF_BTF_LOAD
BPF_BTF_GET_FD_BY_ID
BPF_TASK_FD_QUERY
BPF_MAP_LOOKUP_AND_DELETE_ELEM
BPF_MAP_FREEZE
BPF_BTF_GET_NEXT_ID
BPF_MAP_LOOKUP_BATCH
BPF_MAP_LOOKUP_AND_DELETE_BATCH
BPF_MAP_UPDATE_BATCH
BPF_MAP_DELETE_BATCH
BPF_LINK_CREATE
BPF_LINK_UPDATE
BPF_LINK_GET_FD_BY_ID
BPF_LINK_GET_NEXT_ID
BPF_ENABLE_STATS
BPF_ITER_CREATE
BPF_LINK_DETACH
BPF_PROG_BIND_MAP
BPF_TOKEN_CREATE
BPF_PROG_STREAM_READ_BY_FD
BPF_PROG_ASSOC_STRUCT_OPS
BPF_PROG_RUN = BPF_PROG_TEST_RUN
)
// BPFProgramType represents an type for an eBPF program.
type BPFProgramType uint
// Valid types of eBPF programs.
const (
BPF_PROG_TYPE_UNSPEC BPFProgramType = iota
BPF_PROG_TYPE_SOCKET_FILTER
BPF_PROG_TYPE_KPROBE
BPF_PROG_TYPE_SCHED_CLS
BPF_PROG_TYPE_SCHED_ACT
BPF_PROG_TYPE_TRACEPOINT
BPF_PROG_TYPE_XDP
BPF_PROG_TYPE_PERF_EVENT
BPF_PROG_TYPE_CGROUP_SKB
BPF_PROG_TYPE_CGROUP_SOCK
BPF_PROG_TYPE_LWT_IN
BPF_PROG_TYPE_LWT_OUT
BPF_PROG_TYPE_LWT_XMIT
BPF_PROG_TYPE_SOCK_OPS
BPF_PROG_TYPE_SK_SKB
BPF_PROG_TYPE_CGROUP_DEVICE
BPF_PROG_TYPE_SK_MSG
BPF_PROG_TYPE_RAW_TRACEPOINT
BPF_PROG_TYPE_CGROUP_SOCK_ADDR
BPF_PROG_TYPE_LWT_SEG6LOCAL
BPF_PROG_TYPE_LIRC_MODE2
BPF_PROG_TYPE_SK_REUSEPORT
BPF_PROG_TYPE_FLOW_DISSECTOR
BPF_PROG_TYPE_CGROUP_SYSCTL
BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
BPF_PROG_TYPE_CGROUP_SOCKOPT
BPF_PROG_TYPE_TRACING
BPF_PROG_TYPE_STRUCT_OPS
BPF_PROG_TYPE_EXT
BPF_PROG_TYPE_LSM
BPF_PROG_TYPE_SK_LOOKUP
BPF_PROG_TYPE_SYSCALL
BPF_PROG_TYPE_NETFILTER
)
// BPFAttachType represents an attachment type for an eBPF program.
type BPFAttachType uint
// All valid attachment types for eBPF programs.
const (
BPF_CGROUP_INET_INGRESS BPFAttachType = iota
BPF_CGROUP_INET_EGRESS
BPF_CGROUP_INET_SOCK_CREATE
BPF_CGROUP_SOCK_OPS
BPF_SK_SKB_STREAM_PARSER
BPF_SK_SKB_STREAM_VERDICT
BPF_CGROUP_DEVICE
BPF_SK_MSG_VERDICT
BPF_CGROUP_INET4_BIND
BPF_CGROUP_INET6_BIND
BPF_CGROUP_INET4_CONNECT
BPF_CGROUP_INET6_CONNECT
BPF_CGROUP_INET4_POST_BIND
BPF_CGROUP_INET6_POST_BIND
BPF_CGROUP_UDP4_SENDMSG
BPF_CGROUP_UDP6_SENDMSG
BPF_LIRC_MODE2
BPF_FLOW_DISSECTOR
BPF_CGROUP_SYSCTL
BPF_CGROUP_UDP4_RECVMSG
BPF_CGROUP_UDP6_RECVMSG
BPF_CGROUP_GETSOCKOPT
BPF_CGROUP_SETSOCKOPT
BPF_TRACE_RAW_TP
BPF_TRACE_FENTRY
BPF_TRACE_FEXIT
BPF_MODIFY_RETURN
BPF_LSM_MAC
BPF_TRACE_ITER
BPF_CGROUP_INET4_GETPEERNAME
BPF_CGROUP_INET6_GETPEERNAME
BPF_CGROUP_INET4_GETSOCKNAME
BPF_CGROUP_INET6_GETSOCKNAME
BPF_XDP_DEVMAP
BPF_CGROUP_INET_SOCK_RELEASE
BPF_XDP_CPUMAP
BPF_SK_LOOKUP
BPF_XDP
BPF_SK_SKB_VERDICT
BPF_SK_REUSEPORT_SELECT
BPF_SK_REUSEPORT_SELECT_OR_MIGRATE
BPF_PERF_EVENT
BPF_TRACE_KPROBE_MULTI
BPF_LSM_CGROUP
BPF_STRUCT_OPS
BPF_NETFILTER
BPF_TCX_INGRESS
BPF_TCX_EGRESS
BPF_TRACE_UPROBE_MULTI
BPF_CGROUP_UNIX_CONNECT
BPF_CGROUP_UNIX_SENDMSG
BPF_CGROUP_UNIX_RECVMSG
BPF_CGROUP_UNIX_GETPEERNAME
BPF_CGROUP_UNIX_GETSOCKNAME
BPF_NETKIT_PRIMARY
BPF_NETKIT_PEER
BPF_TRACE_KPROBE_SESSION
BPF_TRACE_UPROBE_SESSION
BPF_TRACE_FSESSION
)
// BPFAttr represents the parameters to a bpf(2) call.
type BPFAttr interface {
marshal.Marshallable
implementsBPFAttr()
}
func (a *BPFAttrProgLoad) implementsBPFAttr() {}
func (a *BPFAttrProgQuery) implementsBPFAttr() {}
func (a *BPFAttrProgAttach) implementsBPFAttr() {}
// BPFAttrProgLoad contains parameters for a BPF_PROG_LOAD command.
//
// +marshal
type BPFAttrProgLoad struct {
_ structs.HostLayout
ProgType uint32
InstructionCount uint32
Instructions uint64
License uint64
LogLevel uint32
LogSize uint32
LogBuf uint64
KernVersion uint32
ProgFlags uint32
ProgName [BPF_OBJ_NAME_LEN]byte
ProgInterfaceIndex uint32
ExpectedAttachType uint32
ProgBTFFD uint32
FuncInfoRecSize uint32
FuncInfo uint64
FuncInfoCount uint32
LineInfoRecSize uint32
LineInfo uint64
LineInfoCount uint32
AttachBTFID uint32
AttachFD uint32 // union of either attach_prog_fd or attach_btf_obj_fd
CoreReloCount uint32
FDArray uint64
CoreRelos uint64
CoreReloRecSize uint32
LogTrueSize uint32
ProgTokenFD int32
FDArrayCount uint32
Signature uint64
SignatureSize uint32
KeyringID int32
}
// BPFAttrProgQuery contains parameters for a BPF_PROG_QUERY command.
//
// +marshal
type BPFAttrProgQuery struct {
_ structs.HostLayout
Target uint32 // union of either target_fd or target_ifindex
AttachType uint32
QueryFlags uint32
AttachFlags uint32
ProgIDs uint64
Count uint32 // union of either prog_cnt or count
_ uint32 // padding
ProgAttachFlags uint64
LinkIDs uint64
LinkAttachFlags uint64
Revision uint64
}
// BPFAttrProgAttach contains parameters for a BPF_PROG_ATTACH command.
//
// +marshal
type BPFAttrProgAttach struct {
_ structs.HostLayout
Target uint32 // union of either target_fd or target_ifindex
AttachBPFFD uint32
AttachType uint32
AttachFlags uint32
ReplaceBPFFD uint32
Relative uint32 // union of either relative_fd or relative_id
ExpectedRevision uint64
}
// BPF_ATTR_SIZE is the size of union bpf_attr, which is the largest of
// the sub-command attribute structures.
//
// BPF_ATTR_SIZE is immutable.
var BPF_ATTR_SIZE = max((*BPFAttrProgLoad)(nil).SizeBytes(), (*BPFAttrProgQuery)(nil).SizeBytes(), (*BPFAttrProgAttach)(nil).SizeBytes())
// eBPF-related flags
const (
BPF_F_ALLOW_OVERRIDE = 1 << iota
BPF_F_ALLOW_MULTI
BPF_F_REPLACE
BPF_F_BEFORE
BPF_F_AFTER
BPF_F_ID
BPF_F_PREORDER
BPF_F_LINK = 1 << 13
)