Skip to content

Commit 9fc4303

Browse files
nixprimegvisor-bot
authored andcommitted
Panic if transport.connectionlessEndpoint.baseEndpoint.receiver is mutated during save.
PiperOrigin-RevId: 832558564
1 parent 19abc45 commit 9fc4303

File tree

5 files changed

+33
-0
lines changed

5 files changed

+33
-0
lines changed

pkg/sentry/kernel/kernel.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,7 +704,9 @@ func (k *Kernel) SaveTo(ctx context.Context, stateFile, pagesMetadata io.WriteCl
704704

705705
// Save the kernel state.
706706
kernelStart := time.Now()
707+
state.IsSaving.Store(true)
707708
stats, err := state.Save(ctx, stateFile, k)
709+
state.IsSaving.Store(false)
708710
if err != nil {
709711
return err
710712
}

pkg/sentry/socket/unix/transport/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ go_library(
9999
"//pkg/sentry/hostfd",
100100
"//pkg/sentry/kernel/auth",
101101
"//pkg/sentry/uniqueid",
102+
"//pkg/state",
102103
"//pkg/sync",
103104
"//pkg/sync/locking",
104105
"//pkg/syserr",

pkg/sentry/socket/unix/transport/connectionless.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package transport
1717
import (
1818
"gvisor.dev/gvisor/pkg/abi/linux"
1919
"gvisor.dev/gvisor/pkg/context"
20+
"gvisor.dev/gvisor/pkg/state"
2021
"gvisor.dev/gvisor/pkg/syserr"
2122
"gvisor.dev/gvisor/pkg/waiter"
2223
)
@@ -39,6 +40,9 @@ var (
3940

4041
// NewConnectionless creates a new unbound dgram endpoint.
4142
func NewConnectionless(ctx context.Context) Endpoint {
43+
if state.IsSaving.Load() {
44+
panic("transport.connectionlessEndpoint being created during kernel save")
45+
}
4246
ep := &connectionlessEndpoint{baseEndpoint{Queue: &waiter.Queue{}}}
4347
q := queue{ReaderQueue: ep.Queue, WriterQueue: &waiter.Queue{}, limit: defaultBufferSize}
4448
q.InitRefs()
@@ -67,6 +71,9 @@ func (e *connectionlessEndpoint) Close(ctx context.Context) {
6771

6872
e.receiver.CloseRecv()
6973
r := e.receiver
74+
if state.IsSaving.Load() {
75+
panic("transport.connectionlessEndpoint being closed during kernel save")
76+
}
7077
e.receiver = nil
7178
e.Unlock()
7279

pkg/state/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ go_library(
6666
srcs = [
6767
"addr_range.go",
6868
"addr_set.go",
69+
"debug.go",
6970
"decode.go",
7071
"decode_unsafe.go",
7172
"deferred_list.go",

pkg/state/debug.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Copyright 2025 The gVisor Authors.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
package state
16+
17+
import (
18+
"sync/atomic"
19+
)
20+
21+
// IsSaving is set to true during kernel object graph saving for debugging.
22+
var IsSaving atomic.Bool

0 commit comments

Comments
 (0)