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:
parent
ffebe42860
commit
117243aa02
293 changed files with 16413 additions and 2842 deletions
|
|
@ -22,6 +22,7 @@ import (
|
|||
"github.com/sagernet/gvisor/pkg/sleep"
|
||||
"github.com/sagernet/gvisor/pkg/sync"
|
||||
"github.com/sagernet/gvisor/pkg/tcpip"
|
||||
"github.com/sagernet/gvisor/pkg/tcpip/link/qdisc"
|
||||
"github.com/sagernet/gvisor/pkg/tcpip/stack"
|
||||
)
|
||||
|
||||
|
|
@ -60,7 +61,7 @@ type queueDispatcher struct {
|
|||
|
||||
mu queueDispatcherMutex `state:"nosave"`
|
||||
// +checklocks:mu
|
||||
queue packetBufferCircularList
|
||||
queue qdisc.PacketBufferCircularList
|
||||
|
||||
newPacketWaker sleep.Waker `state:"nosave"`
|
||||
closeWaker sleep.Waker `state:"nosave"`
|
||||
|
|
@ -78,7 +79,7 @@ func New(lower stack.LinkWriter, n int, queueLen int) stack.QueueingDiscipline {
|
|||
for i := range d.dispatchers {
|
||||
qd := &d.dispatchers[i]
|
||||
qd.lower = lower
|
||||
qd.queue.init(queueLen)
|
||||
qd.queue.Init(queueLen)
|
||||
|
||||
d.wg.Add(1)
|
||||
go func() {
|
||||
|
|
@ -101,19 +102,19 @@ func (qd *queueDispatcher) dispatchLoop() {
|
|||
case &qd.newPacketWaker:
|
||||
case &qd.closeWaker:
|
||||
qd.mu.Lock()
|
||||
for p := qd.queue.removeFront(); p != nil; p = qd.queue.removeFront() {
|
||||
for p := qd.queue.RemoveFront(); p != nil; p = qd.queue.RemoveFront() {
|
||||
p.DecRef()
|
||||
}
|
||||
qd.queue.decRef()
|
||||
qd.queue.DecRef()
|
||||
qd.mu.Unlock()
|
||||
return
|
||||
default:
|
||||
panic("unknown waker")
|
||||
}
|
||||
qd.mu.Lock()
|
||||
for pkt := qd.queue.removeFront(); pkt != nil; pkt = qd.queue.removeFront() {
|
||||
for pkt := qd.queue.RemoveFront(); pkt != nil; pkt = qd.queue.RemoveFront() {
|
||||
batch.PushBack(pkt)
|
||||
if batch.Len() < BatchSize && !qd.queue.isEmpty() {
|
||||
if batch.Len() < BatchSize && !qd.queue.IsEmpty() {
|
||||
continue
|
||||
}
|
||||
qd.mu.Unlock()
|
||||
|
|
@ -137,9 +138,13 @@ func (d *discipline) WritePacket(pkt *stack.PacketBuffer) tcpip.Error {
|
|||
}
|
||||
qd := &d.dispatchers[int(pkt.Hash)%len(d.dispatchers)]
|
||||
qd.mu.Lock()
|
||||
haveSpace := qd.queue.hasSpace()
|
||||
if d.closed.Load() == qDiscClosed {
|
||||
qd.mu.Unlock()
|
||||
return &tcpip.ErrClosedForSend{}
|
||||
}
|
||||
haveSpace := qd.queue.HasSpace()
|
||||
if haveSpace {
|
||||
qd.queue.pushBack(pkt.IncRef())
|
||||
qd.queue.PushBack(pkt.IncRef())
|
||||
}
|
||||
qd.mu.Unlock()
|
||||
if !haveSpace {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue