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
|
|
@ -25,8 +25,8 @@ func (a *acceptQueue) beforeSave() {}
|
|||
// +checklocksignore
|
||||
func (a *acceptQueue) StateSave(stateSinkObject state.Sink) {
|
||||
a.beforeSave()
|
||||
var endpointsValue []*Endpoint
|
||||
endpointsValue = a.saveEndpoints()
|
||||
endpointsValue := a.saveEndpoints()
|
||||
_ = ([]*Endpoint)(endpointsValue)
|
||||
stateSinkObject.SaveValue(0, endpointsValue)
|
||||
stateSinkObject.Save(1, &a.pendingEndpoints)
|
||||
stateSinkObject.Save(2, &a.capacity)
|
||||
|
|
@ -150,9 +150,7 @@ func (q *epQueue) StateTypeName() string {
|
|||
}
|
||||
|
||||
func (q *epQueue) StateFields() []string {
|
||||
return []string{
|
||||
"list",
|
||||
}
|
||||
return []string{}
|
||||
}
|
||||
|
||||
func (q *epQueue) beforeSave() {}
|
||||
|
|
@ -160,14 +158,12 @@ func (q *epQueue) beforeSave() {}
|
|||
// +checklocksignore
|
||||
func (q *epQueue) StateSave(stateSinkObject state.Sink) {
|
||||
q.beforeSave()
|
||||
stateSinkObject.Save(0, &q.list)
|
||||
}
|
||||
|
||||
func (q *epQueue) afterLoad(context.Context) {}
|
||||
|
||||
// +checklocksignore
|
||||
func (q *epQueue) StateLoad(ctx context.Context, stateSourceObject state.Source) {
|
||||
stateSourceObject.Load(0, &q.list)
|
||||
}
|
||||
|
||||
func (p *processor) StateTypeName() string {
|
||||
|
|
@ -496,14 +492,15 @@ func (e *Endpoint) StateFields() []string {
|
|||
"lastOutOfWindowAckTime",
|
||||
"pmtud",
|
||||
"alsoBindToV4",
|
||||
"terminateAtRestore",
|
||||
}
|
||||
}
|
||||
|
||||
// +checklocksignore
|
||||
func (e *Endpoint) StateSave(stateSinkObject state.Sink) {
|
||||
e.beforeSave()
|
||||
var stateValue EndpointState
|
||||
stateValue = e.saveState()
|
||||
stateValue := e.saveState()
|
||||
_ = (EndpointState)(stateValue)
|
||||
stateSinkObject.SaveValue(12, stateValue)
|
||||
stateSinkObject.Save(0, &e.TCPEndpointStateInner)
|
||||
stateSinkObject.Save(1, &e.TransportEndpointInfo)
|
||||
|
|
@ -561,6 +558,7 @@ func (e *Endpoint) StateSave(stateSinkObject state.Sink) {
|
|||
stateSinkObject.Save(54, &e.lastOutOfWindowAckTime)
|
||||
stateSinkObject.Save(55, &e.pmtud)
|
||||
stateSinkObject.Save(56, &e.alsoBindToV4)
|
||||
stateSinkObject.Save(57, &e.terminateAtRestore)
|
||||
}
|
||||
|
||||
// +checklocksignore
|
||||
|
|
@ -621,6 +619,7 @@ func (e *Endpoint) StateLoad(ctx context.Context, stateSourceObject state.Source
|
|||
stateSourceObject.Load(54, &e.lastOutOfWindowAckTime)
|
||||
stateSourceObject.Load(55, &e.pmtud)
|
||||
stateSourceObject.Load(56, &e.alsoBindToV4)
|
||||
stateSourceObject.Load(57, &e.terminateAtRestore)
|
||||
stateSourceObject.LoadValue(12, new(EndpointState), func(y any) { e.loadState(ctx, y.(EndpointState)) })
|
||||
stateSourceObject.AfterLoad(func() { e.afterLoad(ctx) })
|
||||
}
|
||||
|
|
@ -683,8 +682,6 @@ func (p *protocol) StateFields() []string {
|
|||
"maxRetries",
|
||||
"synRetries",
|
||||
"dispatcher",
|
||||
"seqnumSecret",
|
||||
"tsOffsetSecret",
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -711,12 +708,8 @@ func (p *protocol) StateSave(stateSinkObject state.Sink) {
|
|||
stateSinkObject.Save(15, &p.maxRetries)
|
||||
stateSinkObject.Save(16, &p.synRetries)
|
||||
stateSinkObject.Save(17, &p.dispatcher)
|
||||
stateSinkObject.Save(18, &p.seqnumSecret)
|
||||
stateSinkObject.Save(19, &p.tsOffsetSecret)
|
||||
}
|
||||
|
||||
func (p *protocol) afterLoad(context.Context) {}
|
||||
|
||||
// +checklocksignore
|
||||
func (p *protocol) StateLoad(ctx context.Context, stateSourceObject state.Source) {
|
||||
stateSourceObject.Load(0, &p.stack)
|
||||
|
|
@ -737,8 +730,7 @@ func (p *protocol) StateLoad(ctx context.Context, stateSourceObject state.Source
|
|||
stateSourceObject.Load(15, &p.maxRetries)
|
||||
stateSourceObject.Load(16, &p.synRetries)
|
||||
stateSourceObject.Load(17, &p.dispatcher)
|
||||
stateSourceObject.Load(18, &p.seqnumSecret)
|
||||
stateSourceObject.Load(19, &p.tsOffsetSecret)
|
||||
stateSourceObject.AfterLoad(func() { p.afterLoad(ctx) })
|
||||
}
|
||||
|
||||
func (rc *rackControl) StateTypeName() string {
|
||||
|
|
@ -964,8 +956,8 @@ func (s *segment) beforeSave() {}
|
|||
// +checklocksignore
|
||||
func (s *segment) StateSave(stateSinkObject state.Sink) {
|
||||
s.beforeSave()
|
||||
var optionsValue []byte
|
||||
optionsValue = s.saveOptions()
|
||||
optionsValue := s.saveOptions()
|
||||
_ = ([]byte)(optionsValue)
|
||||
stateSinkObject.SaveValue(12, optionsValue)
|
||||
stateSinkObject.Save(0, &s.segmentEntry)
|
||||
stateSinkObject.Save(1, &s.segmentRefs)
|
||||
|
|
@ -1053,6 +1045,7 @@ func (s *sender) StateFields() []string {
|
|||
return []string{
|
||||
"TCPSenderState",
|
||||
"ep",
|
||||
"finSent",
|
||||
"lr",
|
||||
"firstRetransmittedSegXmitTime",
|
||||
"writeNext",
|
||||
|
|
@ -1078,21 +1071,22 @@ func (s *sender) StateSave(stateSinkObject state.Sink) {
|
|||
s.beforeSave()
|
||||
stateSinkObject.Save(0, &s.TCPSenderState)
|
||||
stateSinkObject.Save(1, &s.ep)
|
||||
stateSinkObject.Save(2, &s.lr)
|
||||
stateSinkObject.Save(3, &s.firstRetransmittedSegXmitTime)
|
||||
stateSinkObject.Save(4, &s.writeNext)
|
||||
stateSinkObject.Save(5, &s.writeList)
|
||||
stateSinkObject.Save(6, &s.rtt)
|
||||
stateSinkObject.Save(7, &s.minRTO)
|
||||
stateSinkObject.Save(8, &s.maxRTO)
|
||||
stateSinkObject.Save(9, &s.maxRetries)
|
||||
stateSinkObject.Save(10, &s.gso)
|
||||
stateSinkObject.Save(11, &s.state)
|
||||
stateSinkObject.Save(12, &s.cc)
|
||||
stateSinkObject.Save(13, &s.rc)
|
||||
stateSinkObject.Save(14, &s.spuriousRecovery)
|
||||
stateSinkObject.Save(15, &s.retransmitTS)
|
||||
stateSinkObject.Save(16, &s.startCork)
|
||||
stateSinkObject.Save(2, &s.finSent)
|
||||
stateSinkObject.Save(3, &s.lr)
|
||||
stateSinkObject.Save(4, &s.firstRetransmittedSegXmitTime)
|
||||
stateSinkObject.Save(5, &s.writeNext)
|
||||
stateSinkObject.Save(6, &s.writeList)
|
||||
stateSinkObject.Save(7, &s.rtt)
|
||||
stateSinkObject.Save(8, &s.minRTO)
|
||||
stateSinkObject.Save(9, &s.maxRTO)
|
||||
stateSinkObject.Save(10, &s.maxRetries)
|
||||
stateSinkObject.Save(11, &s.gso)
|
||||
stateSinkObject.Save(12, &s.state)
|
||||
stateSinkObject.Save(13, &s.cc)
|
||||
stateSinkObject.Save(14, &s.rc)
|
||||
stateSinkObject.Save(15, &s.spuriousRecovery)
|
||||
stateSinkObject.Save(16, &s.retransmitTS)
|
||||
stateSinkObject.Save(17, &s.startCork)
|
||||
}
|
||||
|
||||
func (s *sender) afterLoad(context.Context) {}
|
||||
|
|
@ -1101,21 +1095,22 @@ func (s *sender) afterLoad(context.Context) {}
|
|||
func (s *sender) StateLoad(ctx context.Context, stateSourceObject state.Source) {
|
||||
stateSourceObject.Load(0, &s.TCPSenderState)
|
||||
stateSourceObject.Load(1, &s.ep)
|
||||
stateSourceObject.Load(2, &s.lr)
|
||||
stateSourceObject.Load(3, &s.firstRetransmittedSegXmitTime)
|
||||
stateSourceObject.Load(4, &s.writeNext)
|
||||
stateSourceObject.Load(5, &s.writeList)
|
||||
stateSourceObject.Load(6, &s.rtt)
|
||||
stateSourceObject.Load(7, &s.minRTO)
|
||||
stateSourceObject.Load(8, &s.maxRTO)
|
||||
stateSourceObject.Load(9, &s.maxRetries)
|
||||
stateSourceObject.Load(10, &s.gso)
|
||||
stateSourceObject.Load(11, &s.state)
|
||||
stateSourceObject.Load(12, &s.cc)
|
||||
stateSourceObject.Load(13, &s.rc)
|
||||
stateSourceObject.Load(14, &s.spuriousRecovery)
|
||||
stateSourceObject.Load(15, &s.retransmitTS)
|
||||
stateSourceObject.Load(16, &s.startCork)
|
||||
stateSourceObject.Load(2, &s.finSent)
|
||||
stateSourceObject.Load(3, &s.lr)
|
||||
stateSourceObject.Load(4, &s.firstRetransmittedSegXmitTime)
|
||||
stateSourceObject.Load(5, &s.writeNext)
|
||||
stateSourceObject.Load(6, &s.writeList)
|
||||
stateSourceObject.Load(7, &s.rtt)
|
||||
stateSourceObject.Load(8, &s.minRTO)
|
||||
stateSourceObject.Load(9, &s.maxRTO)
|
||||
stateSourceObject.Load(10, &s.maxRetries)
|
||||
stateSourceObject.Load(11, &s.gso)
|
||||
stateSourceObject.Load(12, &s.state)
|
||||
stateSourceObject.Load(13, &s.cc)
|
||||
stateSourceObject.Load(14, &s.rc)
|
||||
stateSourceObject.Load(15, &s.spuriousRecovery)
|
||||
stateSourceObject.Load(16, &s.retransmitTS)
|
||||
stateSourceObject.Load(17, &s.startCork)
|
||||
}
|
||||
|
||||
func (wl *protectedWriteList) StateTypeName() string {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue