summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/kernel/syscalls_state.go
diff options
context:
space:
mode:
authorAdin Scannell <ascannell@google.com>2020-03-25 16:55:02 -0700
committerAdin Scannell <ascannell@google.com>2020-04-08 10:00:14 -0700
commit94b793262d3c54b4c32fed83d2bd121069680d15 (patch)
treec89f8101c0a39d419f21793afbd38e9eb8f64840 /pkg/sentry/kernel/syscalls_state.go
parent71c7e24e5cb8641f4cb98b5fc848ae2033b29eac (diff)
Fix all copy locks violations.
This required minor restructuring of how system call tables were saved and restored, but it makes way more sense this way. Updates #2243
Diffstat (limited to 'pkg/sentry/kernel/syscalls_state.go')
-rw-r--r--pkg/sentry/kernel/syscalls_state.go36
1 files changed, 27 insertions, 9 deletions
diff --git a/pkg/sentry/kernel/syscalls_state.go b/pkg/sentry/kernel/syscalls_state.go
index 00358326b..90f890495 100644
--- a/pkg/sentry/kernel/syscalls_state.go
+++ b/pkg/sentry/kernel/syscalls_state.go
@@ -14,16 +14,34 @@
package kernel
-import "fmt"
+import (
+ "fmt"
-// afterLoad is invoked by stateify.
-func (s *SyscallTable) afterLoad() {
- otherTable, ok := LookupSyscallTable(s.OS, s.Arch)
- if !ok {
- // Couldn't find a reference?
- panic(fmt.Sprintf("syscall table not found for OS %v Arch %v", s.OS, s.Arch))
+ "gvisor.dev/gvisor/pkg/abi"
+ "gvisor.dev/gvisor/pkg/sentry/arch"
+)
+
+// syscallTableInfo is used to reload the SyscallTable.
+//
+// +stateify savable
+type syscallTableInfo struct {
+ OS abi.OS
+ Arch arch.Arch
+}
+
+// saveSt saves the SyscallTable.
+func (tc *TaskContext) saveSt() syscallTableInfo {
+ return syscallTableInfo{
+ OS: tc.st.OS,
+ Arch: tc.st.Arch,
}
+}
- // Copy the table.
- *s = *otherTable
+// loadSt loads the SyscallTable.
+func (tc *TaskContext) loadSt(sti syscallTableInfo) {
+ st, ok := LookupSyscallTable(sti.OS, sti.Arch)
+ if !ok {
+ panic(fmt.Sprintf("syscall table not found for OS %v, Arch %v", sti.OS, sti.Arch))
+ }
+ tc.st = st // Save the table reference.
}